gpt4 book ai didi

.net - 当引用存储在基类变量中时,CLR 如何正确调用派生类隐藏的方法?

转载 作者:行者123 更新时间:2023-12-03 21:37:10 24 4
gpt4 key购买 nike

我试图了解当对象引用存储在基类变量中时对象隐藏基类成员时,CLR 如何正确调度方法调用。

我的困惑点是运行时创建的对象头。堆上的对象头有两个字段:类型指针和同步块(synchronized block)索引。类型指针指向类的方法表。即使对象引用是基类的,在堆上创建的对象也是派生类的。这应该导致运行时使用派生类对象的方法表。但是运行时正确地调用了基类成员。

您能否帮助我理解流程,因为 CLR 在这种情况下如何正确调用方法?

最佳答案

对象 header 中记录的对象类型在这里无关紧要。编译器发出方法调用,命名应调用其方法的特定类。在生成的 IL 中非常明显。例如:

class Base {
void foo() { }
void callFoo() {
foo(); // <== here
}
}
class Derived : Base {
new void foo() { }
}

指示的语句生成此 IL:
IL_0002:  call       instance void ConsoleApplication1.Base::foo()

注意调用操作码中 Base 的存在,没有歧义。

关于.net - 当引用存储在基类变量中时,CLR 如何正确调用派生类隐藏的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12017538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com