C++菱形虚拟继承

Posted zhaocx111222333

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++菱形虚拟继承相关的知识,希望对你有一定的参考价值。

注:Windows操作系统下32位程序

普通继承

我们先看普通的菱形继承,数据的存储情况:

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.B::_a = 1;
	d.C::_a = 2;
	d._b = 3;
	d._c = 4;
	d._d = 5;
	B b = d;
	C c = d;
	return 0;
}

在这里插入图片描述

菱形继承

接下来是菱形继承:

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.B::_a = 1;
	d.C::_a = 2;
	d._b = 3;
	d._c = 4;
	d._d = 5;
	B b = d;
	C c = d;
	return 0;
}

在这里插入图片描述

这里是通过了B和C的两个指针,指向的一张表。这两个指
针叫虚基表指针,这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到下面的A。

当我么需要继承的类有很多内容时,仅用一个指针偏移量就可以找到内容,避免了内容的大量冗余。

以上是关于C++菱形虚拟继承的主要内容,如果未能解决你的问题,请参考以下文章

C++菱形继承问题与虚拟继承原理

C++菱形继承问题与虚拟继承原理

C++之继承总结(继承的定义与格式,赋值转换,默认成员函数,菱形继承及菱形虚拟继承)

C++菱形虚拟继承

C++之继承详解

C++菱形继承