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

本文深入探讨了C++面向对象编程中继承的三个关键原则:确保public继承表示is-a关系,避免遮掩继承而来的名称,以及区分接口继承与实现继承。此外,还介绍了使用private继承、多重继承、通过复合塑模出has-a关系,并讨论了如何明智地使用这些概念。文章旨在帮助开发者理解并应用面向对象设计的最佳实践。

条款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”的两相结合

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值