C++之虚继承

一、虚继承的目的

虚继承主要是为了解决多继承问题中出现同名成员的数据冗余,和调用不方便的问题。

二、虚继承的问题

class M{
public:
    M(int d):_d(d){}
    int _d;
};

class X:virtual public M{
public:
    X(int x):M(x){}
};

class Y:virtual public M{
public:
    Y(int y):M(y){}
};

class Z: public X, public Y{
public:
    Z(int z):X(1), Y(2), M(z){}
    void dis(){
        cout << X::_d << endl;
        cout << Y::_d << endl;
        cout << Z::_d << endl;
    }
};

class N: public Z{
public:
    N(int n):Z(n), M(n){}
    void print(){
        cout << X::_d << endl;
        cout << Y::_d << endl;
        cout << Z::_d << endl;
        cout << _d << endl;
    }
};

int main()
{
    Z z(100);
    z.dis();
    cout << "------------------" << endl;
    z._d = 200;
    z.dis();
    cout << "------------------" << endl;
    N n(10);
    //n._d = 20;
    z.dis();
    cout << "------------------" << endl;
    n.print();
    cout << "------------------" << endl;
    return 0;
}

输出结果:
这里写图片描述

这里要注意一点:子类Z的构造函数中要显示调用虚基类M的构造函数,负责编译是不通过的。

这个地方开始我一直有个地方不明白,为什么我通过N类把_d的值改成了10,用z.dis()输出结果还是200,用n.print()输出结果就是10,郁闷了我1个小时,最后发现,压根就是两个不同的对象,有个毛线关系,改成n.dis()输出就也是10,,真的是越学越糊涂了……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值