非虚拟函数是静态绑定的——208
结合条款33:如果基类一个非虚拟函数,派生类也有这个函数的定义,派生类中的此函数会遮掩基类的函数。因为非虚拟函数是静态绑定的。
讨论以下定义:
class B{
public:
void mf();
...
};
class D:public B{
public:
void mf(); //遮掩了B::mf
...
};
D x;
B* pB = &x;
D* pD=&x;
pB->mf(); //调用B::mf
pD->mf(); //调用D::mf
虚拟函数是动态绑定的——209
如果上节的mf()是个虚拟函数,不论是通过pB或pD调用mf,都会导致调用D::mf,因为pB和pD真正指的都是一个类型为D的对象。
总结——210
绝对不要重新定义继承而来的non-virtual函数。