非虚拟函数是静态绑定的——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函数。
本文深入探讨了非虚拟函数与虚拟函数的区别,解释了静态绑定和动态绑定的概念。当派生类重新定义基类的非虚拟函数时,将发生静态绑定,导致函数调用依据编译时的类型决定;而虚拟函数则实现动态绑定,函数调用依据运行时的类型决定,使得多态成为可能。
299

被折叠的 条评论
为什么被折叠?



