东莞产品网站建设,宁波网站优化方案,个人网站开发模式,wordpress cpu1.什么是菱形继承 单继承#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承 多继承#xff1a;一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承的问题#xff1a;菱形继承有数据冗余和二义性的问题#xff0c;数据冗余是由于创建多个相同类型的…1.什么是菱形继承 单继承一个子类只有一个直接父类时称这个继承关系为单继承 多继承一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承的问题菱形继承有数据冗余和二义性的问题数据冗余是由于创建多个相同类型的数据浪费空间二义性是由于两个不同的类同时继承了一个相同的类 虚拟继承可以解决菱形继承的二义性和数据冗余的问题.需要注意的是虚拟继承不要在其他地 方去使用,且在BC处使用virtual关键字即可。
2.菱形虚拟继承原理
为了研究虚拟继承原理我们给出了一个简化的菱形继承继承体系再借助内存窗口观察对象成 员的模型。
class A
{
public:int _a;
};
// class B : public A
class B : virtual public A
{
public:int _b;
};
// class C : public A
class C : virtual public A
{
public:int _c;
};
class D : public B, public C
{
public:int _d;
};int main()
{D d;/*d._a 1;B b;b._a 0;B* ptr b;ptr-_a;ptr d;ptr-_a;*///cout b._a endl;/*d.B::_a 10;d.C::_a 11;cout d.B::_a endl;cout d.C::_a endl;*/B b;b._a 10;C c;c._a 11;cout b._a endl;cout c._a endl;return 0;
}
在菱形继承情况下有菱形继承的二义性和数据冗余的问题。 从上图中可以看出B中有一个·a,C中也有一个a,造成数据的二义性。
使用菱形继承 这个数据为16进制的数据为20和12而20和12正好是B里面的指针减去A的指针和C里面的指针减去A的指针的大小所以这两个数就是偏移量这两个指针叫虚基表指针这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到下面的A。所以使用虚拟继承可以解决数据冗余和二义性问题。
3.总结