Effective C++ 读书笔记(六) 继承与面向对象设计

来源:互联网 发布:地图绘制软件中文版 编辑:程序博客网 时间:2024/05/29 03:07

条款32:确定你的pubilc继承塑模出is-a关系

                                   Make sure public inheritance models “is-a”

–  C++进行(OOP)面向对象编程,最重要的一个规则是:public inheritance (公开继承)意味“is - a”(是一种)关系。

–  如果你令class D(“derived”)以public形式继承class B(“Base”),你便是告诉编译器: 每一个类型为D的对象同时也是一个类型为B的对象,反之不成立。

–  “pubilc继承”意味is-a。适用于Base classes身上的每一件事情一定也是用于Derived classes 身上,因为每一个Derived class对象也都是一个Base Class对象。


条款33:避免遮掩继承而来的名称
              Avoid hiding inherited names.

–  Derived classes内的名称会隐藏Base classes内的名称。

–  为了能让被隐藏的名称可以使用,可用using声明式或(转交函数)。


 条款34:区分接口继承和实现继承
           Differentiate between inheritance of interface and inheritance ofimplementation


–  Pure virtual函数有两个最突出的特性:它们必须被任何“继承它们”的具象class重新声明,而且它们在抽象class(基类)中通常没有定义。

•    声明一个purevirtual函数的目的是为了derived classes只继承函数接口。

•    声明一个impurevirtual函数的目的,是让derived classes继承该函数的接口和缺省实现。

•    声明non-virtual函数的目的是为了令derivedclasses继承函数的接口及一份强制性实现。

–  接口继承和实现继承不同。在pubilc继承下,derivedclasses总是继承Base class 的接口。

–  Pure virtual函数只具体指定接口继承。

–  Impure virtual 函数具体指定接口继承及缺省实现继承。

–  Non-virtual函数具体指定接口继承以及强制性实现继承



条款35:考虑virtual函数以外的其他选择

                Consider alternative to virtual functions.

–  使用non-virtualinterface(NVI)手法,那是Template Method设计模式的一种特殊形式。它以public non-virtual成员函数包裹较低访问性(private 或protected)的virtual函数。

将virtual函数替换为“函数指针成员变量”。将功能从成员函数移到class外部函数,带来一个缺点是,非成员函数无法访问class的non-public成员



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

                                   Never redefine an inherited non-virtual function.

–  绝对不要重新定义继承而来的non-virtual函数。



条款37:绝不重新定义继承而来的缺省参数值

–  Nerver redefine a function’s inherited default prameter value.

–  绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定,而virtual函数-----你唯一应该复写的东西-------却是动态绑定。



条款38:通过复合塑模出has-a或“根据某物实现出”

               Model “has-a” or “is-implemented-in-terms-of”through composition.

–  复合(composition)是类型之间的一种关系,当某种类型的对象内含它种类型的对象,便是这种关系。

–  复合(composition)的意义和public继承完全不同

–  在应用域(applicationdomain),复合意味has-a(有一个)。在实现域(implementation domain),复合意味is-implemented-in-terms-of(根据某物实现出)。



条款39:明智而审慎地使用private继承

                 Use private inheritance judiciously.

–  如果classes之间的继承关系是private,编译器不会自动将一个derivedclass对象转换为一个Base class对象。

–  Private base class继承而来的所有成员,在derived class中都会变成private属性。

c++裁定凡是独立(非附属)对象都必须有非零大小。勒令默默安插一个char到空对象内。

EBO(空白基类最优化):
   class Empty();

   class HoldsAnInt : private Empty

   {

   private:

   int x; 

    }

 sizeof(HoldsAnInt) == sizeof(int);


条款40:明智而审慎的使用多重继承

                Use multiple inheritance judiciously

–  多重继承比单一继承复杂。它可能导致新的歧义性,以及对virtual继承的需要。

–  Virtual继承会增加大小、速度、初始化(及赋值)复杂度等等成本

–  多重继承的确有正当用途。其中一个情节涉及“public继承某个Interface class”和“private继承某个协助实现的class”的两相结合