17.2C++ 钻石继承 虚基类 Virtual

儿子继承父亲和母亲,父母亲又继承人类,导致人类在儿子中开辟了两份重复的数据,造成空间浪费

#include <iostream>
using namespace std;
class Man
{
public:
    int data;
public:
    Man(int a = 0) : data(a){ cout << "构造Man" << data << endl; }
    ~Man() { cout << "析构Man" << data << endl; }
};

class Father:public Man
{
public:
    int data;
public:
    Father(int a = 0) : data(a),Man(a) { cout << "构造Father" << data << endl; }
    ~Father() { cout << "析构Father" << data << endl; }
};

class Mother:public Man
{
public:
    int data;
public:
    Mother(int a = 0) : data(a),Man(a) { cout << "构造Mother" << data << endl; }
    ~Mother() { cout << "析构Mother" << data << endl; }
};

class Son : public Mother, public Father
{
public:
    Son(int a = 1, int b = 2, int c = 3) :  Mother(b), Father(a),data(c){cout << "构造Son" << data << endl;}//无法给直接man初值,只能从能通过 Mother, Father带多个参数再给man初始化
    ~Son() { cout << "析构Son" << data << endl; }
public:
    int data;
};

int main()
{
    Son son;
    son.data = 10;
    son.Father::data= 20;
    son.Mother::data= 30;
    son.Father::Man::data =40;//‘Man’ is an ambiguous base of ‘Son’
    son.Mother::Man::data =50;//这个数据存两份没有意义
    cout << " Father size " << sizeof(Father) << endl;//8
    cout << " Mother size " << sizeof(Mother) << endl;//8
    cout << " Son size " << sizeof(Son) << endl;//20

    return 0;
}

我们希望从共同父类得到的数据,内存中只存一份,需要用到虚拟继承virtual,虚拟继承

构造过程:先构造虚基类,再构造父类,再构造子类

#include <iostream>
using namespace std;
class Man
{
public:
    int Xman;
public:
    Man(int a = 0) : Xman(a){ cout << "构造Xman:" << Xman << endl; }
    ~Man() { cout << "析构Man" << Xman << endl; }
};

class Father:virtual public Man
{
public:
    int data;
public:
    Father(int a = 0) : data(a),Man(a) { cout << "构造Father" << data << endl; }
    ~Father() { cout << "析构Father" << data << endl; }
};

class Mother:virtual public Man
{
public:
    int data;
public:
    Mother(int a = 0) : data(a),Man(a) { cout << "构造Mother" << data << endl; }
    ~Mother() { cout << "析构Mother" << data << endl; }
};

class Son : public Mother, public Father
{
public:
    Son(int a = 1, int b = 2, int c = 3) : Man(10086),Father(a),Mother(b),data(c){cout << "构造Son" << data << endl;}
    ~Son() { cout << "析构Son" << data << endl; }
public:
    int data;
};

int main()
{
    Son son;
    son.data = 10;
    son.Father::data= 20;
    son.Mother::data= 30;
    cout<<"son.Xman:"<<son.Xman<<endl;
    son.Xman = 200;//vitual 虚拟继承,共同父类,只存了一份父类数据
    cout<<"son.Father::Man::Xman:"<<son.Father::Man::Xman<<endl;
    cout<<"son.Mother::Man::Xman:"<<son.Mother::Man::Xman<<endl;
    cout << " Father size " << sizeof(Man) << endl;//16为什么是16
    cout << " Father size " << sizeof(Father) << endl;//16
    cout << " Mother size " << sizeof(Mother) << endl;//16
    cout << " Son size " << sizeof(Son) << endl;//40

    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值