《C++多继承之菱形继承》

导言:
java、python等面向对象语言仅支持单继承,而c++语言不仅支持单继承,也支持多继承。c++语言在支持多继承的同时也会带来一些小麻烦——菱形继承。


菱形继承:
多继承中的菱形继承之所以得名是因为菱形继承的关系模型像一个菱形而得名。如下图所示:
这里写图片描述

#include<iostream>
using namespace std;


class A
{
public:
    int _a;
};
class B: public A
{
public:
    int _b;
};
class C : public A
{
public:
    int _c;
};
class D: public B,public C
{
public:
    int _d;
};

int main()
{
    D d;
    d.B::_a = 1;
    d.C::_a = 2;
    d._b = 3;
    d._c = 4;
    d._d = 5;
    return 0;
}

解决方案:
对于二义性问题,我们可以利用在访问变量时指明变量的作用域解决,例如:

D d;
d.B::_a;
d.C::_a;

但数据冗余问题还是没有得到解决,类D的对象中还是存在两份类A的成员。为此,c++语言以支持虚继承的方式解决类似于菱形继承数据冗余问题,当在类B、类C的继承方式前冠以虚继承关键字virtual时便构成虚继承,此后在子类中便只会有类A的一份成员存储在子类对象中。

这里写图片描述

#include<iostream>
using namespace std;


class A
{
public:
    int _a;
};
class B: virtual public A
{
public:
    int _b;
};
class C : virtual public A
{
public:
    int _c;
};
class D: public B,public C
{
public:
    int _d;
};

int main()
{
    D d;
    d.B::_a = 1;
    d.C::_a = 2;
    d._b = 3;
    d._c = 4;
    d._d = 5;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值