zoukankan      html  css  js  c++  java
  • 条款40:慎重的选择多重继承

    多重继承很容易带来的一个问题就是歧义的问题:

     1 class BorrowAble{
     2 public:
     3     void checkOut() const;
     4     ...
     5 };
     6 class ElectronicGadget{
     7 private:
     8     bool checkOut()const;
     9     ...
    10 };
    11 class MP3Player:
    12     public BorrowAbleItem,
    13     public ElectronicGadget
    14     {...};
    15 MP3Player mp;
    16 mp.checkOut();
    这样checkOut的调用实际上就是未定义的了,不考虑作用域来说,这个mp能够取得两个checkOut的名称。
    可能的调用方法就是:mp.BorrowableItem::checkOut();
     
    还有一种致命的问题就是:如果两个base类还拥有一个相同的基类的话,那么就会导致base对象的重复发生。正确的做法是像下面这样使用virtual继承,这样就避免了继承相同的数据:
    1 class File{...};
    2 class InputFile : virtual public File{...};
    3 class OutputFile : virtual public File{...};
    4 class IOFile : public InputFile,
    5                 public OutputFile
    6                 {...};
    当然,使用virtual继承是要付出代价的,起生成的对象往往会更大以及访问速度也会变慢。
     
    另外一个不太显著的缺点是,通过virtual继承得到的最终类往往与其含有数据的基类距离不止一个的继承距离。但是这些类同时还要负责这些佛如初始化工作。
     
    所以综上所述:对于virtual base class 的忠告是很简单的:非必须不要使用virtual base, 如果要使用尽量不要再virtual base中存放数据,以免忘了进行初始化工作之后带来一些诡异的后果。
     
    小结:
    多重继承比单一继承要复杂,可能会导致新的歧义性,以及起往往还需要virtual继承
    virtual继承会增加,大小,速度,初始化,复杂度等成本,最好的virtual base class不应该带有数据。
    多重继承的正确用途往往出现在:
    pubic继承自某个interface class以及private 继承字某个协助实现的class二者的组合。
  • 相关阅读:
    bootstrap模态框手动开启关闭与设置点击外部不关闭
    mybatis的增删改查返回值小析(六)
    mac安装python本版管理工具pyenv
    taro 编译 建议修改:使用循环的 index 变量作为 key 是一种反优化
    taro-多个input同一个事件处理
    python初探(01D) line 2 SyntaxError: Non-ASCII character 'xe8' 报错
    taro父、子组件通信
    taro---image引入图片
    webpack(五)---模块热替换
    webpack(四)---开发系列
  • 原文地址:https://www.cnblogs.com/-wang-cheng/p/4889798.html
Copyright © 2011-2022 走看看