我想知道虚拟和覆盖在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()?
答案 0 :(得分:1)
遇到虚方法时,IL发出的callvirt
将检查该方法是否在运行时的任何派生类中被覆盖。这就是为什么要调用派生类中的Display的原因。
您可以检查发射的IL以查看。
答案 1 :(得分:0)
它将执行最接近的方法定义。但是,如果您从base.Display
调用Derived.Display
,它将执行基类的版本。
注意:强>
此外,由于Display
受到保护,因此无法从您使用它的地方调用它。