item39:明智而审慎地使用private继承

       private继承意味implemented-in-terms-of(根据某物实现出)。如果你让class D以private形式继承class B,你的用意是为了采用class B内已经备妥的某些特性,不是因为B对象和D对象存在有任何观念的关系。private继承纯粹只是一种实现技术(这就是为什么继承自一个private base class的每样东西在你的class内都是private:因为它们都只是实现枝节而已)。private继承意味只有实现部分被继承,接口部分应略去。如果D以private形式继承B,意思是D对象根据B对象实现而得,而没有其他意涵了。private继承在软件“设计”层面上是没有意义,其意义只及于软件实现层面。

      private继承意味is-implemented-in-terms-of(根据某物实现出),这个事实有点令人不安,复合(composition)的意义也是这样。你如何在两者之间取舍?答案很简单:尽可能使用复合,必要时才使用private继承。何时才是必要?主要是当derived class需要访问protected base class的成员,或需要重新定义继承而来的virtual函数时候。其实还有一种激进情况,那是当空间方面的厉害关系足以踢翻private继承的支柱时。

     这个激进情况真有够激进,只适用于你所处理的class不带任何数据时。这样的classes没有non-static成员变量,没有virtual函数(对象中存在vptr),没有virtual base classes。于是这中所谓的empty classes对象不使用任何空间,因为没有任何隶属对象的数据需要存储。然而由于技术上的理由,C++ 裁定凡是独立(非附属)对象都必须有非零的大小如果你这样做:

    class Base{ };

    class Derived{

    private:

           int x;

           Base b;

    };

    你会发现sizeof(Derived)> sizeof(int);一个Empty 成员变量竟然要求内存。在大多数编译器中sizeof(Base)获得1,因为面对"大小为零之对立(非附属)对象",通常C++官方勒令默默安插一个char到空对象内empty classes也可以实例化对象,这样实例化出来的对象才会有独一无二的地址!然而齐位需求(alignment)也许Derived对象不只获得一个char大小,也许实际上被放大到足够又存取一个int。


    但或许你注意到了,我很小心地说“独立(非附属)”对象的大小一定不为0.也就是说,这个约束不适用与derived class对象内的 base class成分,因为他们并非独立(非附属).如果你继承Base:

    class Base{} ;

    class Derived:private Base{

    private:

            int x;

    };

    几乎可以确定sizeof(Derived) == sizeof(int)。这就是所谓的EBO(empty base optimization,空白基类最优化)。如果你是一个程序库开发任何,而你的客户非常在意空间,那么值得注意EB0.另外值得注意的是,EB0一般只在单一继承(而非多重继承)才可行,统治C++对象布局的那些规则通常表示EBO无法被施行于“拥有多个base”的derived classes身上。也就是说:

class Base1{   
private:

};
class Base2{   
private:

};
class Derived:public Base1,public Base2{//多重继承,基类都是empty classes
private:
int d;
};

    上述代码中,sizeof(Derived) > sizeof(int)。


     现实中的“empty” classes并不是真的empty。虽然他们从未拥有non-static成员变量,却往往内含typedefs,enums,static成员变量,或non-virtual函数。STL就有许多技术用途的empty classes,其中内含有用的成员(通常是typedefs),包括base classes unary_function和binary_function,这就是“用户自定义之函数对象”通常会继承的classes。感谢EBO的广泛实践,使这样的继承很少增加derived classes的大小。



                                          ——来自 Scott Meyers<<Effective C++>>第三版---侯捷译  



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值