多重继承的特点、作用/意义和使用条件
来源:互联网 发布:美工和平面设计的区别 编辑:程序博客网 时间:2024/05/23 21:52
多重继承的特点、意义和使用条件
多重继承MI:Multiple Inheritance;单一继承:Single Inheritance;
C++阵营中有两派:一种是认为多重继承不好用,一种认为多重继承好用。实际上,多重继承有时候效果比单一继承更好,但是比较复杂;如标准库的iostream实际就是一个多重继承得到的类。
多重继承的特点
在继承树只有一层的情况下,多重继承几乎等同于按顺序单一继承了若干个类。但是,在继承树比较长的情况下,多重继承的情况会很复杂。
1. 多重继承的类分为public、private、protected混合的继承,还包含普通继承和virtual继承。
2. 如果一个继承树中,从最早的最上面的基类到下面的后面的子类存在两条或以上的继承路径,将会导致子类会有两条或以上的基类构造路径,将会导致含有同名称的重复数据成员。
钻石型多重继承:
class BaseBase{};class BaseA{} : public BaseBase{};class BaseB{} : public BaseBase{};class Derive : public BaseA,public BaseB{};
Derive与BaseBase之间有两条继承路径,这将导致Derived会从两条继承路径中分别继承公共基类中的同名成员。
例:BaseBase::data被BaseA继承、BaseB继承,然后Derived继承BaseA、BaseB,这导致Derive中含有两个data成员,==**直接使用derive.data调用将会导致歧义,必须使用derive.BaseA::data、derive.BaseB::data来调用。
如果发生钻石继承即含有多个同名称的成员时,使用virtual避免
继上:
class BaseA{} : virtual public BaseBase{};class BaseB{} : virtual public BaseBase{};class Derive : public BaseA,public BaseB{};
==使用virtual继承保证多重继承的时候,被继承的基类中的成员不会重复==。
virtual继承的作用和代价
virtual继承将导致编译器生成的代码更大,生成的程序速度减慢。
作用:当某个类可能作为其他类的基类的时候,且它继承自某个类,则使用virtual继承,可以让它继承的类中如果有与其它共同基类重名的情况,不会导致保留两份成员而只会保留一份。
virtual base class的使用
如果有必要使用多重继承时,平常最好使用普通的继承即non-virtual继承;必须使用virtual继承时,尽可能避免在virtual base class中定义数据成员,防止多条路径继承时产生多个同名称的数据成员。
C++中不带数据成员的virtual base class类似于Java和C#的接口类interface;Java、C#不允许在接口类中定义数据成员的原因与C++的相同,都是防止同名数据成员有多个副本
总结:多重继承在不得已的情况下可以使用,但是几乎可以肯定存在不需要多重继承就能解决问题的方案;如果使用多重继承,应该考虑是否要使用virtual继承;如果使用virtual继承,则virtual base class最好不要定义任何数据成员,这样生成的代码速度更快、更小且降低复杂度
本人公众号:taojuxiu
- 多重继承的特点、作用/意义和使用条件
- private继承的特点和意义以及何时使用
- C++虚继承的意义和使用
- 多重继承下的类作用域
- C++ 多重继承 虚拟继承的使用
- JSP的作用和特点
- vpn的作用和特点
- 接口的作用和意义
- HashCode的意义和作用
- UUID的意义和作用
- NETIF_FLAG_LINK_UP的意义和作用
- 继承和继承的机构特点
- 继承概念、特点、作用 继承的基本概念:继承指一个对象直接使用另一对象的属性和方法 继承的作用:继承是面向对象语言的重要机制。借助继承,可以扩展原有的代码,应用到其他程序中,而不必重新编写这些代码。
- Java 内部类的作用,实现多重继承
- Java 内部类最重要的作用-实现多重继承
- c++中多重继承的使用
- 使用JS中的Call方法实现继承和多重继承
- 转: 多重继承和void*的糗事
- Impala数据类型
- Xcode8 安装插件方案
- 6737 vss 尺寸设置
- Java多线程的创建(方法二)
- Gardle 创建一个任务 规划任务运行的顺序03
- 多重继承的特点、作用/意义和使用条件
- 数人云|PaaS Innovation 2017 云计算大会那么多,关心PaaS只有它
- 关于行为树插件Behavior Designer的学习(三)_Conditionals条件任务
- Android 使用ActivityLifecycleCallbacks监听自己应用Activity的生命周期
- shader forge扭曲、粒子发光、物体交互
- dll教程 (VC++6.0)C++与C#
- iframe重复加载的问题
- HTTP缓存
- 对拍