多继承可以看作是单继承的扩展。所谓多继承是指派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承。
多继承下派生类的定义格式如下:
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};
其中,<继承方式1>,<继承方式2>,…是三种继承方式:public、private、protected之一。例如:
class Base
{
…foo(){};
};
class A
{
…foo(){};
…AWant(){};
};
class B
{
…foo(){};
…BWant(){};
};
class C : public A, public B
{
…foo(){};
…BWant(){};
…AWant(){};
};
但是当class A:public class Base;
class B:public class Base;
时,即两个基类A,B又派生于Base基类的时候,就可能出现二义性。
C在调用同名方法foo时,无法知道是调用A的foo方法还是B的foo方法。从而出现二义性.
由于我只想我通过将C的实例指针赋值给B类指针,从而只暴露BWant方法。
我的的一种另类解决方法是:
改写B类:
class B :public Base
{
B(C* c):_c(c){};
…foo(){};
…BWant(){ c->BWant();}; //间接调用C类的BWant()方法。
protected:
C* _c;
};
改写C类,只继承A基类
class C : public A
{
…foo(){};
…BWant(){};
…AWant(){};
};
C* c=new C();
B* b = new B(c);// 将C实例作为参数传入B类构造函数
b->BWant(); // 封装,间接调用C类的BWant()方法。