zoukankan      html  css  js  c++  java
  • 条款 39:明智而审慎地使用private继承

    1、private继承的两条规则

    • 规则一:如果classes之间是private继承关系,那么编译器不会自动将一个derived class对象转换为一个base class对象。
    • 规则二:由private base class继承而来的所有成员,在derived class中都会变成private属性,纵使它们在base class中原本是protectedpublic属性。

    2、private 继承所描述的关系

    • private继承 意味这implemented-in-terms-ofprivate 继承只是一种实现技术,它没有“设计”层面上的意义。
    • private继承只有实现部分被继承,接口应该被忽略。

    3、复合与private继承的选择

    疑问:

    复合和private继承都是描述implemented-in-terms-of 关系,那么在类设计时应该使用复合还是private继承该如何选择呢?

    (1)首先大部分情况下应该尽可能的使用复合。
    (2)在下述几种情况使用private继承:
    • 当protected成员或virtual函数牵扯进来的时候。(由于需求的原因,这时正统的设计)
    • 另一种更激进的情况:当基类为空类时,可以起到节约内存空间的作用。(如果客户对于内存空间的要求极高的话,可以采用private继承。)

    注意:“empty class”:这里的空类是指只包含:typedefs,enums,static成员变量或者non-virtual函数,不包含non-static成员。

    4、复合与private继承的优缺点比较

    • 复合要比private继承复杂一些。
    • 复合比private继承更容易理解。
    • 复合的耦合性(依存性,需要包含头文件,需要注意文件加载顺序等问题。)要比private继承低。这对大型程序设计非常重要。
    • private继承在某些对内存要求比较高的场合可以起到节约内存的作用。
    • 学习private继承的另一目的是扩展解决问题的思路。

    5、private继承是如何做到节约内存空间的?

    如果一个类为 空类的话,按道理讲,它是不会占用内存空间的。但是如果设计成组合关系,那么编译器会为空类分配一个字节char的内存空间(此时,sizeof(派生类 x) >sizeof(派生类成员变量)),而又由于对齐需求,可能这个字节最终甚至会变成一个int大小。

    如果设计成private继承的话,可以避免上述情况。即:sizeof(派生类 x) == sizeof(派生类成员变量),这便是所谓的EBO(空白基类最优化)。

    注意:

    • 一个独立对象的大小一定不为0,但是这个约束不适用于派生类对象内的base class成分,因为这部分并非是独立的。
    • 在STL中,EBO技术应用很广泛。其base class往往是含有typedefs 的基类。例如:base classes unary_funtionbinary_funtion,这些是用户自定义函数对象通常要继承的基类。
  • 相关阅读:
    推荐一款适合Dynamics 365/Dynamics CRM 2016 使用的弹出窗插件AlertJs
    SSRS 报表开发过程中,除数为0的处理
    [Dynamics 365] 关于Currency的一点随笔
    [Microsoft Dynamics CRM 2016]Invalid Action – The selected action was not valid 错误的诱因及解决方法
    [Dynamics CRM 2016]如何配置多语言显示
    获取经过跳转后的url地址
    Microsoft Dynamics CRM 2013 --针对特定实体,取消保存功能(包含自动保存)
    Microsoft Dynamics CRM 2013 --选项集的多选
    我自己也是找了好久这样的远程打印软件
    QTextStream 读取文件乱码的解决办法
  • 原文地址:https://www.cnblogs.com/lasnitch/p/12764185.html
Copyright © 2011-2022 走看看