为什么调用这个虚方法?

时间:2017-08-24 02:17:40

标签: c# clr

我编写了一个基类和两个派生类:

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()”并不足以澄清我的谜题。请给我更多细节。

1 个答案:

答案 0 :(得分:2)

虚拟方法调用在reference

中解释如下
  

调用虚方法时,对象的运行时类型为   检查一个压倒一切的成员。 最重要的成员   派生类称为,如果不是,则可能是原始成员   派生类已重写成员。

由于 Derived2 类使用“new”关键字隐藏基本方法,因此CLR将在最多派生类中查找重写成员,即 < em> Derived1 并执行其方法。