这部分主要讨论面向对象的设计的一些陷阱:主要涉及构造函数,析构函数,继承,组合,成员可见度
第32条 弄清所要编写的是哪种类
第33条 用小类代替巨类
第34条 用组合代替继承
在不影响调用代码的情况下具有更大的灵活性
更好的编译时隔离,更短的编译时间
例外情况:
(1)如果需要改写虚拟函数
(2)如果需要访问保护成员
(3)如果需要在基类之前构建已使用过的对象,或者在基类之后销毁此对象
(4)如果需要操心虚拟基类
(5)如果能确定空基类优化哪呢给带来好处,包括这种情况下优化的确很重要,以及这种情况下目标编译器确实能实施这种优化
(6)如果需要控制多态
第35条 避免从非要设计成基类的类上继承
策略:(1)用组合代替共用集成或者私有继承
(2)std::unary_fucntion
第36条 优先提供抽象接口
遵循依赖倒置原理
第37条 共用继承即可替换性,继承,不是为了重用,而是为了被重用
Liskov替换原则
例外情况: 策略类和混入类(mixins)通过共用继承添加行为,但这并不是误用共用继承来建模
第38条 实施安全的改写
第39条 考虑将虚拟函数声明为非公用的,将共用函数声明为虚拟的