前面说了多重继承但是只是讲了他的提出和一些好处,其实还是有
些问题的,多重继承增加了累的继承层次的复杂性,并且它的调试难度
也增加了, 这些是很多人不愿意看到的事情。这样也就增加了开发的
风险。所以能够想办法用单继承的来实现的东西最好避免使用多重继承。
还有一种做法是使用混合类或者叫功能类,这个类中只放一些方法,
来等待调用,这些方法都是共通的一些方法,而真正的数据都是存在于
其他的类中。很多类都可以同他一起派生出新的类出来,但我们不必担
心会有同名方法的存在,因为方法很多都是在这个功能类中。
这里说到同名方法,解决同名方法的问题还可以利用虚继承的方法,
如果有个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了,
而实际是自己进行构造的部分。在使用调用的时候就不用担心以上的问题了。