Effective C++ Item 36 绝不重新定义继承而来的 non-virtual 函数
来源:互联网 发布:速卖通软件下载 编辑:程序博客网 时间:2024/06/05 09:20
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie
经验:绝对不要重新定义继承而来的 non-virtual 函数 --> Item 7 "为多态基类声明 virtual 析构函数" 是本条款的特例
示例:
class B{public:void mf();//...};class D: public B{public:void mf(); // 遮掩了B::mf,Item 33 名称遮掩规则}D x;B *pB = &x;D *pD = &x;pB->mf(); // 调用 B::mfpD->mf(); // 调用 D::mf
解析:
1.non-virtual函数是静态绑定的。 pB声明的类型(pointer-to-B)是静态的,而pB指向的类型(class D)是动态的,
通过pB 调用的 non-virtual函数永远是B所定义的版本
2.
public 继承意味着is-a,适用于B对象的每一件事,也适用于D对象,因为每个D对象都是一个B对象
不变性凌驾特异性,B的derived classes一定会继承 mf 的接口和实现,因为 mf是B的一个 non-virtual 函数
重新定义继承 non-virtual函数后产生的茅盾:
如果D真有必要实现出与B不同的mf,那么“每个D都是一个B”就不为真,就不应该以 public 形式继承 B
如果D真的必须以 public 形式继承B,并且如果D越有需要实现出与B不同的 mf,那mf就无法为B反映出“不变性凌驾特异性”的性质
0 0
- Effective C++ Item 36 绝不重新定义继承而来的 non-virtual 函数
- Effective C++:条款36:绝不重新定义继承而来的non-virtual函数
- 《Effective C++》36:绝不重新定义继承而来的non-virtual函数
- 读书笔记《Effective C++》条款36:绝不重新定义继承而来的non-virtual函数
- C++之绝不重新定义继承而来的non-virtual函数(36)---《Effective C++》
- 《Effective C++》读书笔记之item36:绝不重新定义继承而来的non-virtual函数
- Effective C++ 读书笔记 条款36:绝不重新定义继承而来的 non-virtual 函数
- Effective C++条款36解读: 绝不重新定义继承而来的non-virtual函数
- Effective C++ 条款36:绝不重新定义继承而来的non-virtual函数
- 绝不重新定义继承而来的non-virtual函数
- 条款36:绝不重新定义继承而来的non-virtual函数
- 条款36-37绝不重新定义继承而来的non-virtual函数与缺省参数
- 条款36:绝不重新定义继承而来的non-virtual函数
- 绝对不要重新定义继承而来的non-virtual函数(Effective C++_36)
- item36: 绝不重新定义继承而来的non-virtual函数
- 绝不重新定义继承而来的no-virtual函数——effective c++学习笔记
- 条款36:绝不重定义继承而来的non-virtual函数
- Effective C++ Item 37 绝不重新定义继承而来的缺省参数值
- 远程Linux服务器修改Mysql数据库编码及解决编码修改后Mysql无法启动的问题
- linux FAQ
- poj2503Babelfish
- poj2591 Set Definition(递推)
- Android应用开发进阶篇-场景文字识别
- Effective C++ Item 36 绝不重新定义继承而来的 non-virtual 函数
- 8张图理解Java
- 怎样在ios中的Safari内开发出一款类似native app一样的全屏webapp
- C++第1周项目2——胖子伤不起
- 反向Ajax,第3部分:Web服务器和Socket.IO
- hadoop、hbase、zookeeper环境搭建(详细)
- 查询没有雇员的部门信息
- 反向Ajax,第4部分:Atmosphere和CometD
- Spring进阶之Spring中利用HibernateTemplate实现增删查改