多重继承

https://www.oschina.net/translate/cpp-virtual-inheritance

可通过以下代码验证:

#include<iostream>
using namespace std;

/*class Top
{ 
    public: 
        int a;
};

class Left : public Top
{ 
    public: 
        int b;
};

class Right : public Top
{ 
    public: 
        int c;
};

class Bottom : public Left, public Right
{ 
    public: 
        int d;
};

int main()
{
    Bottom* bottom = new Bottom();
    Left* left = bottom;
    Right* right = bottom;

    //Top* top = bottom;    //出现二义性(ambiguous)

    Top* topL = (Left*) bottom;
    Top* topR = (Right*) bottom;

    topL->a = 1;
    topR->a = 2;

    //cout<< bottom->a <<endl;  //二义性

    cout<< sizeof(*bottom) <<endl;  //结果为20(包含两个a,一个b一个c一个d)

    return 0;
}*/


class Top
{ 
    public: 
        int a;
};

class Left : virtual public Top
{ 
    public: 
        int b;
};

class Right : virtual public Top
{ 
    public: 
        int c;
};

class Bottom : public Left, public Right
{ 
    public: 
        int d;
};

int main()
{
    Bottom* bottom = new Bottom();
    Left* left = bottom;
    Right* right = bottom;

    Top* top = bottom;  //不会有二义性

    Top* topL = (Left*) bottom;
    Top* topR = (Right*) bottom;

    topL->a = 1;
    topR->a = 2;

    cout<< bottom->a <<endl;    //不会有二义性

    //类的每个虚拟基类都有一个vptr指针
    //虽然bottom中公用一个Top对象,但是bottom中添加了vptr.Left
    //和vptr.Right两个指针,这两个指针都指向了Top
    cout<< sizeof(*bottom) <<endl;  //结果为24

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值