多重继承: 经典的是菱形继承,如图。
菱形继承将会产生的问题:
把基类A中的成员变量通过B和C两次继承至D。
D的继承结构:
可以看到,ma被继承两次至D;
那么将如何解决这个问题呢?
采用虚继承的方法,将基类A中的ma直接继承至D。
代码如下:
class A
{
public:
A(int data):ma(data){}
int ma;
};
class B:virtual public A
{
public:
B(int data):A(data),mb(data){}
int mb;
};
class C:virtual public A
{
public:
C(int data):A(data),mc(data){}
int mc;
};
class D:public B,public C
{
public:
D(int data):C(data),B(data),A(data),md(data){}
int md;
};
采用虚继承方法所实例化出来的对象会有其基类的虚基类指针,指向基类所产生的虚基类表。对其对象求sizeof会多出虚基类指针的大小。
会将A类中成员变量直接继承至D,解决多次继承问题。