与单继承相比,使用MI更困难,也更容易出现问题。由于这个原因,很多C++用户强烈反对使用MI,一些人甚至希望删除MI;而喜欢MI的人认为,对一些特殊的工程来说,MI很有用,甚至是必不可少的;也有人建议谨慎、适度的使用MI。
当定义一个SingerWaiter的对象时,无法确定worker是singer的还是waiter的,这时候需要使用类型转换来指定对象:
SingerWaiter *ed = new SingerWaiter; //包含两个worker的对象地址
Worker * pw = (Waiter*)ed; //worker in waiter
Worker * pw = (Singer *)ed; //worker in singer
虚基类
虚基类使得从多个类(它们的基类相同)派生出的对象只继承一个基类对象。
Class Singer:public virtual Worker{};
Class Waiter:virtual public Worker{};
Class SingerWaiter:public Singer,public Waiter{};
这个时候SingerWaiter对象只包含Worker对象的一个副本。
SingerWaiter(const Worker &wk, int p=0, int v=Singer::other)
:Worker(wk),Waiter(wk,p),Singer(wk,v){}
需要显示的调用worker的构造函数,则需要上述形式。对于虚基类,必须这样做;对非虚基类,则是非法的。
方法调用
在多重继承中,父子类中都包含了show函数,则产生函数的二义性。
解决办法:使用限定符来限定相应的函数,进行区分。
Void SingerWaiter::show()
{
Singer::show();
Waiter::show();
}