Effective C++读书笔记(六)

条款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