Effective C++36 never refine inherited non-virtual function
1.实验如果违反该条规则会如何
#include <iostream>
using namespace std;
class B{
public:
void mf(){
cout<<"base"<<endl;
}
};
class D: public B{
public:
void mf(){
cout<<"derived"<<endl;
}
};
int main(){
D x;
B* pb = &x;
pb->mf();
D* pd = &x;
pd->mf();
}
分析由于调用的函数是非虚函数,使用指针调用时会发生静态绑定,因此调用指针的静态类型所指的对应函数
2 理论分析
public继承中,非虚函数的继承其实代表了不变性应该凌驾于特异性之上,所以去改变non-virtual函数在子类中的定义本来就与想要表达的语意矛盾.
因此 不要在子类中重新定义public 继承而来的 non-virtual function.