《Effective_C++》读书笔记5

条款31、将文件间的编译依存关系降至最低
1)支持“编译依存性最小化”的一般构想是:相依于声明式,不要相依与定义式。基于构想的两个手段是Handle class和Interface classes。
2)程序库头文件应该以“完全且仅有声明式”的存在。这种做法不论是否涉及templates都适用。

条款32、确定你的public继承塑模出is-a关系
1)“public”继承意味is-a。适用于base classes身上的每一件事情也一定适用与derived class身上,因为每一个derived class 对象也是都是一个base class对象。


条款33、避免遮掩继承而来的名称
1)derived class 内的名称会遮掩base classes内名称。在public继承下从来没有人希望如此
2)为了让被遮掩的名称再见天日,可以使用using声明式或转换函数。

条款34、区分接口继承和实现继承
1)接口继承和实现继承不同。在public继承之下,derived class总是继承base class的接口。
2)pure virtual 函数只具体指定接口继承。
3)简朴的(非纯)impure virtual函数具体指定接口继承及强制实现继承。

条款35、考虑virtual函数以外的其他选择
1)使用non-virtual interface(NVI)手法,那是template method设计模式的一种特殊形式。它以public non-virtual成员函数包裹较低访问性(private和protected)的virtual函数。
2)将virtual函数替换为“函数指针成员变量”,这是strategy设计模式的一种分解表现形式。
3)以tr1::function成员变量替换vitrual函数,因而允许使用任何可调用物搭配一个兼容需求的签名式。这也是strategy设计模式的某种形式。
4)将继承体系内的virtual函数替换为另一个继承体系内的virtual函数。这是strategy设计模式的传统实现手法。
要点提示:
1)virtual函数的替代方案包括NV1手法及strategy设计模式的多种形式。NVI手法本身是一个特殊形式的template method设计模式。
2)将机能从成员函数移到class外部函数,带来的一个缺点,非成员函数无法访问class 的non-public成员。
3)tr1::function对象的行为就像一般函数指针。这样的对象可接纳“与给定之目标签名式(target signature)兼容”的所有可调用物(callable entities)。

条款36、绝不重新定义继承而来的non-virtual函数

条款37、绝不重新定义继承而来的缺省参数值
1)绝不重新定义继承而来的缺省参数值,因为缺省参数值都是静态绑定,而virtual函数--你唯一应该覆写的东西--却是动态绑定。
条款38、通过复合塑模出has-a或“根据某物实现出”
1)复合(composition)的意义和public继承完全不同。
2)在应用域(application domain),复合意味has-a(有一个)。在实现域(implementation domain),复合意味is-implemented-in-terms-of(根据某物实现出)。

条款39、明智而审慎的使用private继承
1)private继承意味is-implemented-in-terms of(根据某物实现出)。它通常比复合的级别低。但是当derived class 需要访问protected base class的成员,或需要重新定义继承而来的virtual函数时,这么设计是合理的
2)和复合不同,private继承可以造成empty base最优化。这对至于“对象尺寸最小化”的程度开发者而言,可能很重要。

条款40、明智而审慎地使用多重继承
1)多重继承比单一继承复杂。它可能导致新的歧义性,以及对Virtual继承的需要。
2)virtual继承会增加大小、速度、初始化(及赋值)复杂等等成本。如果virtual base classes不带任何数据,将是最具实用价值的情况。
3)多重继承的确有正当用途。其中一个情节涉及“public继承某个Interface class”和“private继承某个协助实现的class”的两相组合。

你可能感兴趣的:(设计模式,C++,读书,Class,interface,templates)