本文主要是介绍Effective_C++_条款三十六:绝不重新定义继承而来的non-virtual函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这个条款的内容很简单,见下面的示例:
class BaseClass
{
public:void NonVirtualFunction(){cout << "BaseClass::NonVirtualFunction" << endl;}
};class DerivedClass: public BaseClass
{
public:void NonVirtualFunction(){cout << "DerivedClass::NonVirtualFunction" << endl;}
};int main()
{DerivedClass d;BaseClass* bp = &d;DerivedClass* dp = &d;bp->NonVirtualFunction(); // 输出BaseClass::NonVirtualFunctiondp->NonVirtualFunction(); // 输出DerivedClass::NonVirtualFunction
}
从输出结果可以看到一个有趣的现象,那就是两者都是通过相同的对象d调用成员函数NonVirutalFunction,但显示结果却不相同,这会给读者带来困惑。
现在这个现象的原因是在于BaseClass:NonVirutalFunction与DerivedClass:NonVirtualFunction都是静态绑定,所以调用的non-virtual函数都是各自定义的版本。
回顾下之前的条款,如果是public继承的话,那么:
1) 适用于BaseClass的行为一定适用于DerivedClass,因为每一个DerivedClass对象都是一个BaseClass对象;
2) 如果BaseClass里面有非虚函数,那么DerivedClass一定是既继承了接口,也继承了实现;
3) 子类里面的同名函数会掩盖父类的同名函数,这是由于搜索法则导致的。
如果DerivedClass重定义一个non-virtual函数,那么会违反上面列出的法则。以第一条为例,如果子类真的要重定义这个函数,那么说明父类的这个函数不能满足子类的要求,这就与每一个子类都是父类的原则矛盾了。
可以总结一下了,无论哪一个观点,结论都相同:
任何情况下都不该重新定义一个继承而来的non-virtual函数。
这篇关于Effective_C++_条款三十六:绝不重新定义继承而来的non-virtual函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!