条款35: 使公有继承体现 "是一个" 的含义
注释:C++面向对象编程中一条重要的规则是:公有继承意味着 "是一个" 。条款36: 区分接口继承和实现继承
1) 定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。
2) 声明简单虚函数的目的在于,使派生类继承函数的接口和缺省实现。
3) 声明非虚函数的目的在于,使派生类继承函数的接口和强制性实现。注释1:80-20定律:在一个典型的程序中,80%的运行时间都花在执行20%的代码上。
注释2:也就是说,80%的函数调用可以是虚函数,并且它们不会对程序的整体性能带来哪怕一丁点可以觉察到的影响。所以,在担心是否承担得起虚函数的开销之前,不妨将注意力集中在那20%会真正带来影响的代码上。条款37: 决不要重新定义继承而来的非虚函数
评论:重新实现的同名函数,在基类里面都需要定义为虚函数。
条款38: 决不要重新定义继承而来的缺省参数值
注意:如果缺省参数值被动态绑定,编译器就必须想办法为虚函数在运行时确定合适的缺省值,这将比现在采用的在编译阶段确定缺省值的机制更慢更复杂。做出这种选择是想求得速度上的提高和实现上的简便,所以大家现在才能感受得到程序运行的高效;当然,如果忽视了本条款的建议,就会带来混乱。
条款39: 避免 "向下转换" 继承层次
评论:强制转换其实质是类型不匹配,而类型不匹配也就存在转换失败的风险。如果执行了强制转换,也就需要承担转换失败所带来的结果。
条款40: 通过分层来体现 "有一个" 或 "用...来实现"
注:公有继承的含义是 "是一个"。对应地,分层的含义是 "有一个" 或 "用...来实现",通过私有继承来实现。
条款41: 区分继承和模板
1) 当对象的类型不影响类中函数的行为时,就要使用模板来生成这样一组类。
2) 当对象的类型影响类中函数的行为时,就要使用继承来得到这样一组类。
评论:模板的使用将大大减轻重复的冗余编码劳动,在设计中要尽量考虑,将会抽象架构和流程设计。建议尽可能的使用,但分析一定要透彻。
条款42: 明智地使用私有继承
1) 私有继承意味着只是继承实现,接口会被忽略。
2) 广泛意义上来说,分层是应该优先采用的技术,所以只要有可能,就要尽量使用它。
评论:私有继承将基类的所有特性都封装到新类的内部,将不会对外呈现。
条款43: 明智地使用多继承
评论:尽量使用单继承,保持程序结构代码的简洁性。如果非要使用多继承,多继承基类之间必须是非相关的。
条款44: 说你想说的;理解你所说的
1) 共同的基类意味着共同的特性。
2) 公有继承意味着 "是一个"。
3) 私有继承意味着 "用...来实现"。
4) 分层意味着 "有一个" 或 "用...来实现"。
下面的对应关系只适用于公有继承的情况:
1) 纯虚函数意味着仅仅继承函数的接口。
2) 简单虚函数意味着继承函数的接口加上一个缺省实现。
3) 非虚函数意味着继承函数的接口加上一个强制实现。
第一章:从C转向C++ (Effective C++ Second Edition 读书笔记)
第二章:内存管理(Effective C++ Second Edition 读书笔记)
第三章:构造函数,析构函数和赋值操作(Effective C++ Second Edition 读书笔记)
第四章 类和函数:设计与声明(Effective C++ Second Edition 读书笔记)
第五章 类和函数:实现(Effective C++ Second Edition 读书笔记)第六章 继承和面向对象设计 (Effective C++ Second Edition 读书笔记)