继承与面向对象设计
条款三十二 确定你的public继承是一个is-a的关系
- public继承,是一个is-a的关系。因为基类身上的每一件事情一定也适用于继承类身上,因为每一个继承类对象也是一个基类对象。
条款三十三 避免遮掩继承而来的名称
-
名字是什么?一朵玫瑰叫任何名字还是一样芬芳。
-
子类内的名称会遮掩父类内的名称。
条款三十四 区分接口继承和实现继承
-
声明一个纯虚函数(virtual func() = 0)的目的是为了让子类只继承函数接口
-
声明非纯虚函数(virtual func())的目的,是让子类继承该函数的接口,并缺省实现。
-
声明non-virtual函数的目的是为了让子类继承函数的接口以及一份强制性实现
条款三十五 考虑virtual函数以外的其他选择
条款三十六 绝不重新定义继承而来的non-virtual函数
- 动态绑定(virtual)和静态绑定(non-virtual)的区别
条款三十七 绝不重新定义继承而来的缺省参数值
- 动态绑定(virtual)和静态绑定(non-virtual)的区别
条款三十八 通过复合塑模出has-a或“根据某物实现出”
- 复合,是类型之间的一种关系,当某种类型的对象内含有其他类型的对象,便是这种关系。
条款三十九 明智而谨慎使用private继承
- 尽可能使用复合,必要时使用private
条款四十 明智而谨慎使用多重继承
-
多重继承比单一继承复杂,可能导致新的歧义
-
virtual继承会增加大小、速度、初始化、赋值等成本,如果是virtual base class不带任何数据,将是最有实用价值的情况