//
// 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 */