20180323 C++ 绝不重新定义继承而来的非虚(non-virtual)函数
看下面的例子:
类D是由类B以public形式派生而来的,即:
class B{
public:
void mf();
...
};
class D:public B{...};
若有以下定义:
D x;//x是一个类型为D的对象
请考虑以下两种情况:
情况1:
B* pB = &x;//获得一个指针指向x
pB->mf();//经由该指针调用mf
情况2:
D* pD = &x;//获得一个指针指向x
pD->mf();//经由该指针调用mf
考虑以下版本:
class D:public B{
public:
void mf();
...
};
pB->mf();//语句1
pD->mf();//语句2
语句1调用的是B::mf,而语句2调用的是D::mf,这样产生的两种不同的调用是因为非虚(non-virtual)函数如 B::mf ,D::mf都是静态绑定(statically bound)。
若是动态绑定,即mf是个虚函数,不论是通过pB或pD调用mf,都会导致调用D::mf,因为pB和pD真正指的都是一个类型为D的对象。
/****************************************/
/******* 任何情况下都不该 ***********/
/******* 重新定义一个继承 ***********/
/******* 而来的非虚 ***********/
/******* (non-virtual)函数 ****#******/
/****************************************/