先给大家看一下菱形继承的结构:
B和C都单继承了A
D继承了B和C 是多继承 有两个或两个以上的基类就是多继承
class A
{
public:
A(int a = 0) :ma(a)
{
cout << "A" << endl;
}
public:
int ma;
};
class B : public A
{
public:
B(int b) :mb(b),A(b)
{
cout << "B" << endl;
}
public:
int mb;
};
class C : public A
{
public:
C(int c) :mc(c), A(c)
{
cout << "C" << endl;
}
public:
int mc;
};
class D : public B, public C
{
public:
D(int d) :md(d),B(d),C(d)
{
cout << "D" << endl;
}
public:
int md;
};
菱形继承造成的问题:就是D中有两份A中的数据ma 就是所谓的二义性 编译都通不过
为了解决这个问题 可以用虚继承来解决
虚继承的原则就是:谁从A直接继承 就让谁虚继承A
B和C虚继承A
class A
{
public:
A(int a = 0) :ma(a)
{
cout << "A" << endl;
}
virtual void Show()
{
}
public:
int ma;
};
class B : virtual public A
{
public:
B(int b) :mb(b),A(b)
{
cout << "B" << endl;
}
public:
int mb;
};
class C : virtual public A
{
public:
C(int c) :mc(c), A(c)
{
cout << "C" << endl;
}
public:
int mc;
};
class D : public B, public C
{
public:
D(int d) :md(d),B(d),C(d)
{
cout << "D" << endl;
}
public:
int md;
};
B、C都从A虚继承 此时A成为虚基类 这样就可以解决D中有两份A数据的问题 解决了二义性的问题