C++ 多重继承之菱形继承

多重继承

有如下的多重继承模式例子:

C++ 多重继承之菱形继承_第1张图片

#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
class A
{
     
public:
	int _a;
};
// class B : public A
class B : public A
{
     
public:
	int _b;
};
// class C : public A
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;
}

在这里插入图片描述

虚拟继承

采用虚拟继承可以解决多重继承中存在的问题:

  • 数据冗余
  • 二义性
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
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;
	return 0;
}

C++ 多重继承之菱形继承_第2张图片

从上例可以看出:

采用虚拟继承后,类的头部 中多出了虚指针;虚指针用来指向虚基表,虚基表中的内容是,存放的是虚基类中内容的偏移量

你可能感兴趣的:(C++,c++,多态)