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;
}
posted @ 2013-05-28 12:08  helloweworld  阅读(366)  评论(0编辑  收藏  举报