C++之菱形继承的解决之道

来源:互联网 发布:淘宝中的淘气值能干嘛 编辑:程序博客网 时间:2024/05/19 14:50

对于上文中的菱形继承,存在二义性的问题的解决方案:

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会有一份rpublic:A(int i,int j):R(i),a(j){}};//父类class B :virtual  public R//注意变成了虚继承{private:int b;//父类B会有一份rpublic:B(int i, int j) :R(i), b(j) {}};//子类class C :public A, public B{private:int c;//子类C会有两份r,一份来自A,一份来自Bpublic: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;}


0 0
原创粉丝点击