菱形继承的二义性

两个子类继承同一个父类,而又有子类又分别继承这两个子类,就称作菱形继承

以下就是一个菱形继承的例子

#include <iostream>
#include <memory>
#include <string>
using namespace std;

struct A
{
	int data;
};

struct B :virtual A
{
	
};

struct C :virtual A   
{
	
};

struct D : B , C  
{

};

当B和C分别继承A的virtual型时,此时,B和C共享A中的内容,比如我们创建了一个B的实例并尝试在B中修改A的data,此时C的实例或者D的实例调用data的话,data也会发生变化。

如果把virtual去掉的话,那么B和C分别独立继承A中的内容,两者互不影响

二义性:

如果A中有一个需要传入参数的构造函数,我们通过B和C分别调用A的构造函数的话,那D中输出什么内容呢?

struct A
{
	int data;

	A(int theData)
		:data{ theData }
	{
	}
};

struct B : virtual A
{
	B() :A{ 1 }
	{
		cout << data << endl;
	}
};

struct C : A    
	C() :A{ 2 }
	{
		cout << data << endl;
	}
};

struct D : B, C   
{
	
};

int main()
{
	D d;
	cout << d.data << endl;
	return 0;
}

此时程序会报错,因为编译器不知道去调用哪个子类中的构造函数,这个时候我们只能通过D调用构造函数去给data传值

D() :A{ 3 }
	{
	}

D中调用A的构造函数传入的值会同时影响B和C,也就是说子类影响了两个父类

若把B和C分别继承virtual A,那么就要看调用的顺序了。

猜你喜欢

转载自blog.csdn.net/alex1997222/article/details/81364804