int main() { B b; b.f=&B_Mem; //B_Mem代表B的“虚函数” D d; d.f=&D_Mem; //以D_Mem来覆盖(override)B的虚函数 call_virtual(&b); //输出“I am B” call_virtual(&d); //输出“I am D” } 在这个改进的例子中,派生类对象可以通过修改函数指针f的指向,从而获得特定的行为,这里重要的是,call_virtual函数不再需要通过丑陋的if-else语句来判定对象的具体类型,而只是简单的通过一个指针来调用“虚函数”——这时候,假如派生类需要改变具体的行为,则可以将相应的函数指针指向它自己的函数即可,这招“偷梁换柱”通过增加一个间接层的办法“神不知鬼不觉”地将“虚函数”替换(Override)掉了。 然而,这招仍然还有缺点——要用户手动实现,可扩展性差,透明性差等等。然而,它的思想已经接近现代编译器对多态机制的实现手法了。
public class C:IFirst,Isecond { public override void f1(){} public override void f2(){} public override void s1(){} public virtual void c1(){} } 类型C的内存布局大体是这样的(由于.NET是单根的继续结构,每个类都隐式的继续自Object,所以,类型C的“虚函数表”中包含Object的所有成员函数)