网站经营网络备案信息管理系统/最佳bt磁力搜索引擎
一、什么是菱形继承?
下面先给出一个图来说明菱形继承:
以下是菱形继承的对象模型:
图中,B类继承了A类(单继承),C类也继承了A类(单继承),D类既继承了A类,又继承了B类(多继承),这样就构成了一个“菱形”继承。
下面我们把这个模型用代码实例化一下:
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 func();
private:int _d;
};
从上面的程序可以看出来,D类由于继承B类和C类,相当于间接的继承了两次A类,这样如果直接访问 _a 就会有二义性和数据冗余的问题,如:
C c1;
c1._a;
//c1 A::_a;
//这两种访问都有二义性
而以下两个访问是正确的:
c1.B::_a;
c1.C::_a;
但是这样用类名限定访问未免过于麻烦,那么,如何能更好的解决菱形继承的二义性和数据冗余的问题呢?下面简单介绍用虚继承解决这个问题:
二、虚继承是怎么解决二义性和数据冗余
1.虚基类说明格式:
virtual<继承方式><基类名>
2.用法(还是用上面那个例子说明)
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 func();
private:int _d;
};
由于使用了虚基类,因此就将两个公共基类合并成了一个类,这样也就消除了合并之前可能出现的二义性。