class B { public: void mf(); ... }; class D: public B {...};
对于以下行为:ide
D x; B *pB = &x; pB->mf(); //和以下的代码 D *pD = &x; pD->mf();
如上调用的两个mf()理应是相同的,可是若是mf()是个虚函数并且D有本身的mf版本,那就有问题了:函数
class D: public B { public: void mf();//hides B:mf(); ... }; pB->mf(); //B::mf() pD->mf(); //D::mf()
上面两种状况出现的缘由是,非虚函数B::mf和D::mf都是静态绑定(statically bound)的,也就是说,因为pB被声明为pointer-to-B,经过pB调用的非虚函数永远是B所定义的版本,即便pB指向一个类型为派生类的对象。spa
虚函数是动态绑定(dynamically bound)的,若是mf是个虚函数,不论经过pB或是pD调用mf,都会调用D::mf,由于pB和pD真正指的都是一个类型为D的对象。code
解决:若是D真的想要出现与B不同的mf,那就把mf声明为virtual吧。对象
牢记:public继承意味着父类子类是一种is-a的关系。blog