多重继承的问题

  前面说了多重继承但是只是讲了他的提出和一些好处,其实还是有

些问题的,多重继承增加了累的继承层次的复杂性,并且它的调试难度

也增加了, 这些是很多人不愿意看到的事情。这样也就增加了开发的

风险。所以能够想办法用单继承的来实现的东西最好避免使用多重继承。

  还有一种做法是使用混合类或者叫功能类,这个类中只放一些方法,

来等待调用,这些方法都是共通的一些方法,而真正的数据都是存在于

其他的类中。很多类都可以同他一起派生出新的类出来,但我们不必担

心会有同名方法的存在,因为方法很多都是在这个功能类中。

  这里说到同名方法,解决同名方法的问题还可以利用虚继承的方法,

如果有个Animal类,从他派生出来的Horse类和Bird类有一个共同的基

类,从Horse和Bird多重继承而派生出来的Pegasus类在调用Animal中

的一些方法的时候我们就需要采取一些方式,不然编译器不知道该通过

Horse还是Bird去调用这个方法。就像一个人告诉你去找监护人的哥哥,

这个时候你就迷惑了,是找爸爸的还是妈妈的哥哥?所以我们这个地方

或者采用显示的限定:

    Horse::方法名; 来实现

或者就利用这里说到的虚继承。就是让Horse和Bird有一个共同的基类

而不是连个基类的拷贝!真很重要。如果是拷贝那么他们通过不同的父类

调用的方法是不一样的。所以通过虚继承。我们让Pegasus在实例化的时

候自己去实例化Animal的部分。那么编译器就知道该如何去调用Animal中

的方法了。

   虚继承:

  class Horse : virtual public Animal .....

  class Bird : virtual public Animal...

  class Pegasus : public Horse, public Bird.....

如此就完成了虚继承,在写Pegasus的构造函数的时候一定也要把Animal

的部分声明好,这个时候就不是通过他们任何一个去继承下来的Animal了,

而实际是自己进行构造的部分。在使用调用的时候就不用担心以上的问题了。

  

原文地址:https://www.cnblogs.com/sunnystone85/p/1400082.html