这种情形会在用Base类型的引用指向Derived2的实例时发生。当使用这种引用的时候,Base中的Stop方法是非虚构,因此没有任何虚方法调用(或派生类型重载)生效。有点奇怪的(但却是预期的)是Turn方法仍将分发到Base中的方法实现。这是因为在Derived2中声明Turn的实现时,开发人员并没有使用override关键字。缺少override关键字将告知c#编译器使用newSlot特性发出方法声明,这是一种导致编译器认为Derived2中的Turn方法与Base中的Turn方法毫无关系的措施。
如果前面的讨论使你陷入迷惑,不妨看看示例6.6。这个示例演练了重写(override)、重载(overload)和接口(
interface)的大多数可能的组合,不妨试着指出这个程序的运行结果,特别是要指出是6个Dolt方法中的哪一个将被编译器和(或者) CLR选中,用于Main方法中的4个方法调用。
第一个调用将分给e,因为对象的具体类型有一个名为DoIt的public方法;第二个调用将分发给e,因为Derved.DoIt被声明为virtual;第三个方法将分发给b,因为即使是Base.DoIt被声明为virtual,但后续的派生方法还是重载了它的使用:第四个调用将分发到C,因为ICommon.Dolt隐式地为virtual。当然,你可能不会像这样编写代码,不过,这可能(当然也可能不能)有助于你认识到CLR支持这种方式。e