两个子类继承同一个父类,而又有子类又分别继承这两个子类,就称作菱形继承
以下就是一个菱形继承的例子
#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,那么就要看调用的顺序了。