虚基类虚派生详解

class  Grand
{
public:
	int a;
	Grand(int i)
	{

	}
};

class A:virtual public Grand //虚继承
{
public:
	A(int i):Grand(i)
	{ 

	}
};

class A2 : virtual public Grand//虚继承
{
public:
	A2(int k) :Grand(k) //虽然这里也要这样写,但是还是有C来初始化Grand
	{

	}
};

class B
{
public:

};

class C :public A, public A2,public B
{
public:
	C(int i,int j,int k) :Grand(i),A(j),A2(k)//初始化
	{

	}
};

这里因为A和A2都虚继承了Grand,所以Grand成为了虚基类。
虚基类的影响在这里最后影响到C。

注意:要保证A和A2都要虚继承。

要虚继承的原因,A和A2都继承了Grand,这个时候相当于A和A2都含有了Grand类的成员,如果C再同时继承A和A2,那么这个时候C就相当于重复的包含了两次Grand类的成员,所以要保证C里只含有一份Grand类成员的话,那么解决办法就是A和A2同时虚继承Grand。

说明:因为现在只有一份Grand,那么带来的问题就是,这个Grand是由A还是A2来初始化呢?
所以,现在Grand是由C来初始化。即要在类C的构造函数初始化列表中初始化Grand。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38158479/article/details/106451256