多重继承的优缺点

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最好不要定义任何数据成员,这样生成的代码速度更快、更小且降低复杂度

猜你喜欢

转载自blog.csdn.net/qq_36946274/article/details/80920340