菱形继承

//

//  LingXing.hpp

//  jicheng

//

//  Created by LXBig on 18/2/5.

//  Copyright © 2018 LXBig. All rights reserved.

//


#ifndef LingXing_hpp

#define LingXing_hpp


#include <stdio.h>

#include <iostream>

using namespace std;


//菱形继承    虚继承

/*

 菱形继承

 问题 :二义性,爷爷类的成员 孙子类里面  两份拷贝

 解决方案:虚继承,让 两个直接父类 虚继承自 爷爷类(虚基类)。

 初始化:孙子类初始化顺序 虚基类,然后直接父类,最后自己扩展。

 */

class A {

protected:

    int aa;

public:

    A(int a ):aa(a){

        printf("A的构造函数!\n");

    }

    A(const A& a):aa(a.aa)

    {

        

    }

    void printInfo()

    {

        printf("aa=%d\n",aa);

    }

};

class B: virtual public A {

protected:

    int bb;

public:

    B(int a = 0,int b = 0):A(a),bb(b){

        printf("B的构造函数!\n");

    }

    B(const B& B):A(B),bb(B.bb)

    {

        

    }

    void printInfo()

    {

        printf("aa =%d, bb=%d\n",aa,bb);

    }

};

class C: virtual public A {

protected:

    int cc;

public:

    C(int a = 0,int c = 0):A(a),cc(c){

        printf("C的构造函数!\n");

    }

    C(const C& C):A(C),cc(C.cc)

    {

        

    }

    void printInfo()

    {

        printf("aa =%d, cc=%d\n",aa,cc);

    }

};

class D : public B,public C{

private:

    int dd;

public:

    //先初始化 虚基类 ,然后 初始化  直接父类,最后 初始化 自己扩展的

    D(int a = 0,int b = 0,int c = 0,int d = 0):A(a),B(a,b),C(a,c),dd(d){

       printf("D的构造函数!\n");

    }

    D(const D& d):A(d),B(d),C(d),dd(d.dd)

    {

        

    }

    void printInfo()

    {

        //二义性。

        printf("aa=%d,bb = %d,cc = %d,dd=%d\n",aa,bb,cc,dd);

    }

};

/*

 项目一 string 写一下。

 Person

 Personset

 */









#endif /* LingXing_hpp */


阅读更多

没有更多推荐了,返回首页