东阳的学习记录
条款32:确定你的public继承塑模出 “is-a”关系
- 正方形并不是矩形
- “is-a”意味着:适用于base class 身上的每一件事情也一定适用于 derived class 。
条款33:避免遮掩继承而来的名称
- 如果你正在使用 public 继承,又不继承那些重载函数,就是违反了 is-a
- 适用using声明,使得 base 的函数可见
- 在private继承下,是可以不满足 is-a 关系的
- 使用 转交函数 继承某个特定版本
条款34:区分接口继承与实现继承
- 缺省的 virtual 实现在现实需求发生改变时可能会造成危险
- 正确的方法是切断 “virtua函数接口”和“缺省实现之间的练习”
- non-virtual 函数不应该在派生类中被重新定义
- 不用过分担心 virtual 函数的成本,谨记80-20法则。
- 对于预期不应该在 derived 中重复定义的函数,应该定义为 non-virtual
条款35:考虑 virtual 之外的其他选择
- NVI:令客户通过 public non-virtual 成员函数调用 private 虚函数
- NVI手法的一个优点便是可在外覆器中对virtual进行前戏和收尾工作
- 适用函数指针代替虚函数,或可调用对象,实现自定义的操作
- 古典模式:将继承体系中的 virtual 替换成另一个继承体系中的 virtual
条款36:绝不重新定义继承而来的 non-virtual 函数
- 当重新定义继承来的非虚函数时,此时用基类指针调用和派生类指针调用时,会出现不同结果
- 任何情况下都不应该重新定义
条款37:绝不重新定义继承而来的缺省参数值
- 静态绑定下,并不从其 base 继承缺省参数值
- 适用NVI模式,可避免这种麻烦
条款38:根据复合塑模出 “has-a” 或 “根据某物实现出”
- has-a:人有一个地址,一个电话
- is-implemented-in-term-of:比如用list可以实现set,表现为一个特例,例如正方形可以用矩形实现,但正方形不是矩形
条款39:明智而审慎地使用private继承
- 尽可能采用复合,除非复合无法满足需求时采用private继承
- 当 derived class 需要访问 protected 成员,或者需要重新定义继承而来的虚函数时,才使用private继承
- EBD空白基类最优化时,才使用private继承
条款40:明智而审慎地使用多重继承
- 多重继承带来函数调用的歧义
- virtual 继承必须付出代价
- virtual base的初始化由继承体系中最底层的 class 负责
- 作者建议:
i. 非必要不使用 virtual base
ii. ==若使用,尽可能避免在其中放置数据,这样一来,就不用担心在其上初始化(赋值)所带来的诡异事情了 == - 多重继承的确有其正当用途。比如, public继承某个 interface, private继承某个协助实现的 class
8219

被折叠的 条评论
为什么被折叠?



