导言:
java、python等面向对象语言仅支持单继承,而c++语言不仅支持单继承,也支持多继承。c++语言在支持多继承的同时也会带来一些小麻烦——菱形继承。
菱形继承:
多继承中的菱形继承之所以得名是因为菱形继承的关系模型像一个菱形而得名。如下图所示:
#include<iostream>
using namespace std;
class A
{
public:
int _a;
};
class B: public A
{
public:
int _b;
};
class C : public A
{
public:
int _c;
};
class D: public B,public C
{
public:
int _d;
};
int main()
{
D d;
d.B::_a = 1;
d.C::_a = 2;
d._b = 3;
d._c = 4;
d._d = 5;
return 0;
}
解决方案:
对于二义性问题,我们可以利用在访问变量时指明变量的作用域解决,例如:
D d;
d.B::_a;
d.C::_a;
但数据冗余问题还是没有得到解决,类D的对象中还是存在两份类A的成员。为此,c++语言以支持虚继承的方式解决类似于菱形继承数据冗余问题,当在类B、类C的继承方式前冠以虚继承关键字virtual
时便构成虚继承,此后在子类中便只会有类A的一份成员存储在子类对象中。
#include<iostream>
using namespace std;
class A
{
public:
int _a;
};
class B: virtual public A
{
public:
int _b;
};
class C : virtual public A
{
public:
int _c;
};
class D: public B,public C
{
public:
int _d;
};
int main()
{
D d;
d.B::_a = 1;
d.C::_a = 2;
d._b = 3;
d._c = 4;
d._d = 5;
return 0;
}