条款32: 确定你的public继承塑模出is-a关系
- public继承意味着is-a模型,适用于base classes身上的每一件事情一定适用于derived classes身上
- 可能会因为软件设计目的的不同而改变,有些情况需要具体情况具体分析
条款33: 避免遮掩继承而来的名称
- derived classes内的名称会遮掩base classes内的名称。若derived内覆盖了base里重载的函数,base的函数将完全不可见
- 可以使用using声明或转交函数解决
条款34: 区分接口继承和实现继承
- 接口继承和实现继承不同。在public继承之下,derived classes总是继承base class的接口
- pure virtual函数只具体指定接口继承
- impure virtual函数具体指定接口继承及缺省实现继承
- non-virtual函数具体指定接口继承以及强制性实现继承
条款36: 绝不重新定义继承而来的non-virtual函数
- 绝不重新定义继承而来的non-virtual函数(设计问题)
条款37: 绝不重新定义继承而来的缺省参数值
- 当继承一个带有缺省参数值的virtual函数时
- 缺省参数值是静态绑定,调用定义于derived class内的virtual函数是,会使用静态类型对应的缺省参数值
条款38: 通过复合塑模出has-a模型
- 复合和public继承的区别: has-a 和 is-a
- 复合意味着is implemented in terms of,根据某物实现
条款39: 谨慎使用private继承
- private和has-a有类似的地方,也意味着in implemented in terms of(根据某物实现出)。他的使用级别通常比复合的级别低。
- 和复合不同,private继承可以造成empty base最优化。
条款40: 谨慎使用多重继承
- 会带来歧义性,以及对virtual继承的需要
- 一个正当用途是public继承interface class和private继承某个协助实现的class