我编写了一个基类和两个派生类:
class Base
{
public virtual void fn()
{
Console.WriteLine("base fn");
}
}
class Derived1 : Base
{
public override void fn()
{
Console.WriteLine("derived1 fn");
}
}
class Derived2 : Derived1
{
public new void fn()
{
Console.WriteLine("derived2 fn");
}
}
然后创建一个由Base变量引用的derived2实例。然后调用fn()方法:
class Program
{
static void Main(string[] args)
{
Base b = new Derived2();
b.fn();
Console.Read();
}
}
结果是调用了Derived1类的fn()。
据我所知,如果调用虚方法,CLR将在运行时类型的方法表中查找该方法,该方法是Derived2;如果调用非虚方法,ClR将在变量类型的方法表中查找它,即Base。但为什么它调用Derived1的方法?
答案“因为Derived1覆盖了Base的fn()”并不足以澄清我的谜题。请给我更多细节。
答案 0 :(得分:2)
虚拟方法调用在reference:
中解释如下调用虚方法时,对象的运行时类型为 检查一个压倒一切的成员。 最重要的成员 派生类称为,如果不是,则可能是原始成员 派生类已重写成员。
由于 Derived2 类使用“new”关键字隐藏基本方法,因此CLR将在最多派生类中查找重写成员,即 < em> Derived1 并执行其方法。