加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 多重继承

发布时间:2020-12-16 09:55:08 所属栏目:百科 来源:网络整理
导读:我有2个基类(B1和B2),它们来自公共基类(B),它们有一个公共变量(let:int x;来自基数B),第一个基数x = 0,第二个基数x = 10(B1,B2构造函数中给出的默认值). 视觉: class B{ int x;protected: B(int x) : x{x}{}};class B1 : public B{protected: B1() : B(0){
我有2个基类(B1和B2),它们来自公共基类(B),它们有一个公共变量(let:int x;来自基数B),第一个基数x = 0,第二个基数x = 10(B1,B2构造函数中给出的默认值).

视觉:

class B
{
    int x;

protected:

    B(int x) : x{x}{}
};

class B1 : public B
{
protected:

    B1() : B(0){}
};

class B2 : public B
{
protected:

    B2() : B(10){}
};

现在,如果我再推导一个类:

class D : virtual public B1,virtual public B2
{
public:

    D() : B1{},B2{}{}
};

这里只有一个x副本可用于虚拟概念,现在如果我尝试使用派生类对象访问x值,x的实例将在O / p(x = 0或x = 10)中得到,为什么?

解决方法

为了使用虚拟继承,必须在B1和B2中将基数B声明为虚拟.没有它,你有B的非虚拟继承.

如果你有非虚拟继承,那么你在D中有两个B基,所以你不能在D中访问x而不将其限定为B1 :: x或B2 :: x

如果你有虚拟继承,那么你只有一个B和一个x,所以它的两个赋值(x = 0和x = 10)将按你执行的顺序发生,而后者中的任何一个都将覆盖该值由前一个设置(与具有两个赋值的简单变量x一样).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读