public Worker{}//基类
public Singer:public Worker{}//继承Worker
public Waiter:public Wokrer{}//继承Worker
public SingingWaiter:public Singer,public Waiter{}//多继承
SingingWaiter ed;
Worker *pw=&ed;//二义性
Worker * pw1=(Waiter *)&ed;
Worker *pw2=(Singer *)&ed;//强制类型转换
2.使用虚基类
Class Singer:virtual public Worker{}
Class Waiter::virtual public Worker{}
Class SingingWaiter:public Singer,Worker{}
这样就只会产生一份Worker对象的数据成员。
3.虚基类的构造函数需要显式在子类中调用
直接或间接继承虚基类的所有派生类都必须在构造函数的成员初始化列表中显式调用虚基类的构造函数
SingingWaiter(const Worker &wk,int p=0;int v=Singer::other):Worker(wk),Waiter(wk,p),Singer(wk,v){}
//调用了Worker,Waiter,Singer的构造函数
4.方法调用
SingingWaiter newhire;
newhire.show();
//Singer和Waiter都拥有show方法,SiningWaiter不知道调用哪个show方法。
newhire.Singer::show();//显式调用Singer的show方法
更好的方法是自己定义SiningrWaiter的show方法。
void SingingWaiter::show(){
Singer::Show();
Waiter::Show();
}