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

 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二者的组合。

转载于:https://www.cnblogs.com/-wang-cheng/p/4889798.html

条款40:慎重的选择多重继承相关推荐

  1. Effective C++条款40:明智而审慎地使用多重继承(Use multiple inheritance judiciously)

    Effective C++条款40:明智而审慎地使用多重继承(Use multiple inheritance judiciously) 条款40:明智而审慎地使用多重继承 1.多重继承的两个阵营 2 ...

  2. 【Effection C++】读书笔记 条款40:明智而审慎的使用多重继承

    [Effection C++]继承与面向对象设计 条款40:明智而审慎的使用多重继承 首先介绍一个个小知识,在C++解析一个名称的时候,首先是名字查找(涉及到作用域),然后是类型匹配,从中找到最佳匹配 ...

  3. 《Effective C++》读书笔记 条款40:明智而审慎地使用多重继承

    多重继承的存在有其合理性,但是在使用多重继承的时候也要注意存在的问题 1.一个派生类可能从多个基类继承相同的名称(函数.typedef等等),这会导致较多的歧义 例子: #include<ios ...

  4. 读书笔记《Effective C++》条款40:明智而审慎地使用多重继承

    一旦涉及多重继承,C++社群便分为两个基本阵营.一派认为如果单一继承是好的,多重继承一定更好.另一派主张,单一继承是好的,但多重继承不值得使用. 最先需要认清的一件事是,当用到多重继承,程序有可能从一 ...

  5. Effective C++ 50条款

    Effective C++ 50条款 条款 1:尽量用 const 和 inline 而不用#define--尽量用编译器而不用预处理 #define max(a,b) ((a) > (b) ? ...

  6. Effective C++ 的52个条款列表

    原文链接: 在线手册 第一章 从C转向C++ 条款1:尽量用const和inline而不用#define 条款2:尽量用而不用 条款3:尽量用new和delete而不用malloc和free 条款4: ...

  7. 《Effective STL》条款解读

    条款01:慎重选择容器类型 vector.list和deque有着不同的复杂度,vector是默认使用的序列类型.当需要频繁在序列中间做插入和删除操作时,应使用list.当大多数插入和删除操作发生在序 ...

  8. 中国神童13岁免试上大学,极端荣耀后却选择出家为僧!

    来源 | 新浮世绘    文章 | 苏鹤鸣 <一> 13岁进入中国科技大学读书.和副总理对弈大获全胜.17岁成为全中国最年轻的大学教师-- 他曾经是全中国家喻户晓的"第一神童&q ...

  9. 如果只能从市面上的Python入门书中选择一本送给你,那我一定会选这本……

    大家好,欢迎来到Crossin的编程教室!我是Crossin. 今天我要给你们送本书. 这本书,亚马逊评分4.5,豆瓣评分8.5,曾获得2011年JOLT(有"软件业界的奥斯卡"之 ...

  10. Effective C++条款39:明智而审慎地使用private继承(Use private inheritance judiciously)

    Effective C++条款39:明智而审慎地使用private继承(Use private inheritance judiciously) 条款39:明智而审慎地使用private继承 1.pr ...

最新文章

  1. php拉查询封装,php实现搜索类封装示例
  2. Git 简易食用指南 v2.0
  3. PHP读写操作Excel
  4. php实现开关效果代码,JavaScript实现开关效果的代码分享
  5. Ubuntu backlight
  6. Ubuntu下Except的安装
  7. 《信息安全系统设计基础》第六周学习总结
  8. coolfire黑客入门教程系列之(八)最后部分!
  9. 基于JSP的学生管理系统
  10. 打不开计算机 在任务栏里显示,电脑打开的窗口在任务栏不显示怎么办?
  11. 微信小程序点击按钮弹出弹窗_微信小程序弹窗,微信小程序页面跳转、弹出框...
  12. ERA5 total precipitation的单位
  13. 区块链电子印章,让盖章更安全高效
  14. mysql导vertica_vertica使用vsql导数据
  15. 【UNI-APP】开发微信公众号(H5)JSSDK调式
  16. 自定义文件格式注册和图标设置
  17. 笔记本屏幕亮度调节的详细步骤
  18. Probably Approximately Correct learning framework
  19. java系统随机产生10道加法运算,用户进行答题,答对一道题加10分,答错不加分
  20. 如何调整android手机正常颜色,安卓手机怎么调颜色反转

热门文章

  1. go env 命令介绍
  2. Pycharm安装完出现interpreter field is empty
  3. oracle高性能分页,Oracle中高性能分页包
  4. 重复类发展手法_正确护肤手法图解!
  5. PHP中的数组(查找)
  6. No package ‘mate-settings-daemon‘ found
  7. LIBAVCODEC_VERSION_INT是哪里定义的?
  8. unknown type name err_status_t; did you mean srtp_err_status_t/err_status_ok/err_status_replay_fail
  9. 要尊重员工的正当权益
  10. 粒子的自旋数,是否就是弦在膜上的关系