文章目录
条款36:绝不重载继承的non-virtual函数
请记住
- 绝对不要重新定义继承而来的non-virtual函数。
我的理解
不要重载,如果需要重写函数请将父类函数声明为virtual类型。
条款37:绝不重定义继承而来的缺省参数
请记住
- 绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定,而virtual函数——你唯一应该覆写的东西——却是动态绑定。
我的理解
差不多的道理,把上面一条更新下,如果需要重写函数请将父类函数声明为纯virtual类型。
条款38:通过复合塑膜出has-a或“根据某物实现出”
请记住
- 复合(composition)的意义和public继承完全不同。
- 在应用域(application domain),复合意味has-a(有一个)。在实现域(implementation domain),复合意味is-implemented-in-terms-of(根据某物实现出)。
我的理解
如果需要复合类型的关系,把需要实现的类,放在private里面是个好的主意
条款39:明智而审慎地使用private继承
请记住
- Private继承意味 is-implemented-in-terms-of(根据某物实现出)。它通常比复合(composition)的级别低。但是当派生类需要访问protected 基类的成员,或需要重新定义继承而来的virtual函数时,这样的设计是合理的。
- 和 复合 不同,private继承可以造成empty基类最优化。这对致力于”对象尺寸最小化“的程序库开发者而言,可能很重要。
我的理解
private继承同样属于一种复合形式,不同于前一种(将类放在private成员中),通过继承可以重新定义virtual函数,或者使用protected成员
条款40:明智而审慎地使用多重继承
请记住
- 多重继承比单一继承复杂。它可能导致新的歧义性,以及对virtual继承的需要。
- virtual继承会增加大小、速度、初始化(及赋值)复杂度等等成本。如果virtual base classes不带任何数据,将是最具使用价值的情况。
- 多重继承的确有正当用途。其中一个情节涉及“public继承某个Interface class”和“private继承某个协助实现的class”的两项组合。
我的理解
少用多重继承,因为它会增加成本,或者增加错误出现的可能性