Effective C++条款37: 决不要重新定义继承而来的非虚函数
该条款最终结论:任何条件下都要禁止重新定义继承而来的非虚函数。
或者说,应该避免“隐藏”现象的发生(所谓隐藏,即派生类重新定义基类的非虚函数)。另一个概念“覆盖”即对虚函数的重新实现的发生是正常的。
从继承和实现的角度看,虚函数是一个接口,实现可以不同,或者说特性可以不同。但是非虚函数表示一种固有的不变的特性,所以不要改变这个不变的特性,否则违背公有继承“是一个”的原则。
class A { public: void fun(int a, int b) { cout << "A" << endl; } }; class B : public A { public: void fun(int a) { cout << "B" << endl; } }; int main() { B b; b.fun(1, 3);//error, B::fun()隐藏了A::fun(),如果B中不定义一个参数的fun(),那么此处是正确的,因为B中不定义fun时,相当于继承了A中的fun. return 0; }