class A { public: void funPrint(){cout<<"funPrint of class A"<<endl;}; };
class B:public A { public: void funPrint(){cout<<"funPrint of class B"<<endl;}; };
void main() { A *p; //定义基类的指针 A a; B b; p=&a; p->funPrint(); p=&b; p->funPrint(); }
大家以为这段代码的输出结果是什么?有的人可能会马上回答funPrint of class A 与 funPrint of class B 因为第一次输出是引用类A的实 例啊,第二次输出是引用类B的实例啊。那么我告诉你这样想就错啦,答案是funPrint of class A 与 funPrint of class A 至于为什么输出 这样的结果不在本文讨论的范围之内;你就记住,不管引用的实例是哪个类的当你调用的时候系统会调用左值那个对象所属类的方法。比如说 上面的代码类A B都有一个funPrint 函数,因为p是一个A类的指针,所以不管你将p指针指向类A或是类B,最终调用的函数都是类A的funPrint 函数。这就是静态联篇,编译器在编译的时候就已经确定好了。可是如果我想实现跟据实例的不同来动态决定调用哪个函数呢?这就须要用到 虚函数(也就是动态联篇)
class A { public: virtualvoid funPrint(){cout<<"funPrint of class A"<<endl;}; };
class B:public A { public: virtualvoid funPrint(){cout<<"funPrint of class B"<<endl;}; };
void main() { A *p; //定义基类的指针 A a; B b; p=&a; p->funPrint(); p=&b; p->funPrint(); }