在C#中进行虚拟和覆盖的内部工作?

时间:2011-08-03 12:58:20

标签: c# oop

  

可能重复:
  Internal Workings of C# Virtual and Override

我想知道虚拟和覆盖在c#中是如何工作的。例如

class Base
{
    public virtual void Display()
    {}
}


class Derived: Base
{
    public override void Display()
    {}
}

Main()
{
    Base obj = new Derived();

    obj.Display();
}

它将调用派生类“Display”方法。

对象如何知道它应该调用Derived.Display(),而不是Base.Display()?

2 个答案:

答案 0 :(得分:1)

遇到虚方法时,IL发出的callvirt将检查该方法是否在运行时的任何派生类中被覆盖。这就是为什么要调用派生类中的Display的原因。

您可以检查发射的IL以查看。

答案 1 :(得分:0)

它将执行最接近的方法定义。但是,如果您从base.Display调用Derived.Display,它将执行基类的版本。

注意: 此外,由于Display受到保护,因此无法从您使用它的地方调用它。