C# 4.0 规范如下:
调用虚拟方法时,发生该调用的实例的运行时类型决定了要调用的实际方法实现。在非虚拟方法调用中,实例的编译时类型是决定因素。
起初,我认为这与初始化有关。例如,给定两个初始化:
BaseClass bcDerived = new Derived();
对比BaseClass bcBase = new BaseClass();
以及辅助类中的重载:
public virtual void Method(Derived d)
{
Console.WriteLine("Result = derived called");
}
public virtual void Method(BaseClass d)
{
Console.WriteLine("Result = base called");
}
Method
在这种情况下,调用不受virtual
关键字的影响。不管是否有标记virtual
,都会调用派生最少的重载。只有在override
派生类中,方法调用才会改变。
那么,“运行时类型”和“编译时类型”是什么意思呢?它们如何影响方法调用?