class B {
public:
void mf();
....
};
class D : public B{ ....};
D x;
----------
B* pB =&x;
pB->mf();
--------
D *pD =&x;
pD->mf();
两次调用都会调用指针类型对应的版本,而不是根据对象是哪种类型决定。
1:非虚函数比如B::mf和D::mf都是静态绑定。意思是由于pB被声明一个指向B的指针,通过pB调用的非虚函数永远是B所定义的版本,而不管指向的对象是那种类型。
2:虚函数是动态绑定的,所以他不用受这个问题的困扰,如果mf是个虚函数,但mf被调用,无论是通过pB或者pD调用mf,都会导致调用D::mf,因为对象是类型为D的对象。
现在如果D重新定义mf,你的设计就出现矛盾。想调用D::mf,却因为指针类型指向B,如果D真有必要实现与B不同的mf,就应该声明为虚函数。