对于上文中的菱形继承,存在二义性的问题的解决方案:
1.直接继承祖先的两个基类,在继承时使用virtual
2.通过多重继承而来的那个子类(孙子辈的类),在构造函数时,要调用祖先类的构造函数
,孙子辈的派生类,直接继承祖先类的成员,在继承两个父类各自拓展的成员
如图所示:
由之前的图1中的派生关系到virtual继承关系
由之前的图2中的构造关系到箭头所示的关系
//菱形继承
#include "stdafx.h"
#include<stdlib.h>
#include<iostream>
using namespace std;
class R//祖先类
{
private:
int r;
public:
R(int anInt):r(anInt){}
void printOn()const
{
cout << "r = " << r << endl;
}
};
//父类
class A :virtual public R//注意变成了虚继承
{
private:
int a;//父类A会有一份r
public:
A(int i,int j):R(i),a(j){}
};
//父类
class B :virtual public R//注意变成了虚继承
{
private:
int b;//父类B会有一份r
public:
B(int i, int j) :R(i), b(j) {}
};
//子类
class C :public A, public B
{
private:
int c;//子类C会有两份r,一份来自A,一份来自B
public:
C(int i,int j,int k,int l):R(i),A(i,j),B(i,k),c(l)//注意修改构造函数,直接构造祖父辈的类R(i)
{}
};
int main()
{
R rr(10);
A aa(20, 30);
B bb(40, 50);
C cc(5, 7, 9,10);
rr.printOn();
aa.printOn();
bb.printOn();
cc.printOn();
system("pause");
return 0;
}