Item 36:不要重写继承来的非虚函数
2015-09-28 11:35
375 查看
Item 36: Never redefine an inherited non-virtual function.
我们还是在讨论public继承,比如
为什么要一样呢?因为public继承表示着"is-a"的关系,每个
32)。
然而重写(override)非虚函数
因为
总是会调用指针类型定义中的那个方法。即
当然虚函数不存在这个问题,它是一种动态绑定的机制。
在子类中重写父类的非虚函数在设计上是矛盾的:
一方面,父类定义了普通函数
a"的关系。
另一方面,如果
除非注明,本博客文章均为原创,转载请以链接形式标明本文地址: http://harttle.com/2015/09/03/effective-cpp-36.html
我们还是在讨论public继承,比如
Derived继承自
Base。如果
Base有一个非虚函数
func,那么客户会倾向认为下面两种调用结果是一样的:
Derived d; Base* pb = &d; Derived* pd = &d; // 以下两种调用应当等效 pb->func(); pd->func();
为什么要一样呢?因为public继承表示着"is-a"的关系,每个
Derived对象都是一个
Base对象(见Item
32)。
然而重写(override)非虚函数
func将会造成上述调用结果不一致:
class Base{ public: void func(){} }; class Derived: public Base{ public: void func(){} // 隐藏了父类的名称func,见Item 33 };
因为
pb类型是
Base*,
pd类型是
Derived*,对于普通函数
func的调用是静态绑定的(在编译期便决定了调用地址偏移量)。
总是会调用指针类型定义中的那个方法。即
pb->func()调用的是
Base::func,
pd->func()调用的是
Derived::func。
当然虚函数不存在这个问题,它是一种动态绑定的机制。
在子类中重写父类的非虚函数在设计上是矛盾的:
一方面,父类定义了普通函数
func,意味着它反映了父类的不变式。子类重写后父类的不变式不再成立,因而子类和父类不再是"is
a"的关系。
另一方面,如果
func应当在子类中提供不同的实现,那么它就不再反映父类的不变式。它就应该声明为
virtual函数。
除非注明,本博客文章均为原创,转载请以链接形式标明本文地址: http://harttle.com/2015/09/03/effective-cpp-36.html
相关文章推荐
- webapi同一个Controller多个函数
- android textview 点击打开facebook个人专页,如果没有则跳到浏览器显示
- 记一次公司仓库数据库服务器死锁过程及解决办法
- Android自定义控件——自定义属性
- HDU 5476 Explore Track of Point (2015年上海赛区网络赛I题)
- 批学习
- 20159281132_《web app SEO》
- 栈的压入、弹出序列
- poj题目分类 很有层次感
- 发现一个oracle11 g 新特性挺有意思
- Swift中String与NSDate的互相转换
- 儿童手表到底安全不全(转自乌云网)
- 包含min函数的栈
- AngularJS小结
- Handler(原理) HandlerThread 轻松实现异步功能
- 面试题之输入一个长整形,如123456,请反序输出
- Android string %1$s %1$d
- Android中spinner的简单用法(1)
- spark高级文本处理技术--spark-Machine Learning With Spark
- 从无到有(统计、请求、MVC、模块化)H5开发须知--一个完整的实例