【发布时间】:2017-08-24 02:17:39
【问题描述】:
我写了一个基类和两个派生类:
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 Class的fn()。
据我所知,如果调用了虚方法,CLR会在运行时类型的方法表中查找该方法,也就是Derived2;如果调用了非虚拟方法,ClR 会在变量类型为 Base 的方法表中查找它。但是为什么会调用Derived1的方法呢?
答案“因为 Derived1 覆盖了 Base 的 fn()”不足以澄清我的困惑。请给我更多的细节。
【问题讨论】: