首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除多重继承中的重复项(使用菱形继承)

删除多重继承中的重复项(使用菱形继承)
EN

Stack Overflow用户
提问于 2022-01-17 18:30:13
回答 1查看 83关注 0票数 0

我试图解决一个钻石继承问题,类PN继承,O继承类NO继承从M继承。

代码语言:javascript
复制
  M
 / \
N   O
 \ /
  P

报头

代码语言:javascript
复制
class M {
   public:
    M();

    M(int aVal);

    int a;
};

class N : virtual public M {
   public:
    N();

    N(int aVal, int bVal);

    void foo();

    int b;
};

class O : virtual public M {
   public:
    O();

    O(int aVal, int cVal);

    void foo();

    int c;
};

class P : public N, public O {
   public:
    P();

    P(int aVal, int bVal, int cVal, int dVal);

    void foo();

    int d;
};

我想要创建一个专门的构造函数来初始化这4个值,而不需要任何重复。

源代码

代码语言:javascript
复制
P::P(int aVal, int bVal, int cVal, int dVal)
: N(aVal, bVal), O(aVal, cVal), d(dVal)
{       
    // Only initialize with initializer list    
}

但是aVal是由NO构造函数初始化的。有什么办法解决这个问题吗?如果需要更多代码,我将提供。

EN

回答 1

Stack Overflow用户

发布于 2022-01-17 19:02:55

但a由N和O构造函数初始化

这种假设是不正确的。如果虚拟继承像这样工作,它不会解决菱形问题(创建了1个构造函数调用=1个对象,如果NO都调用了M的构造函数,那么就会有2个M对象,类似于没有虚拟继承)。

相反,virtual基类总是由大多数派生类初始化,在本例中是P。由于您没有在M构造函数中指定P的初始化,因此使用了默认构造函数。若要使用参数化构造函数,请在成员初始化程序列表中指定它:

代码语言:javascript
复制
P::P(int aVal, int bVal, int cVal, int dVal): M(aVal), N(aVal,bVal), O(aVal,cVal), d(dVal)
{
}

请注意,aValNO中可能未使用。您可能希望重构代码,以包含使用虚拟继承的事实,并删除这些参数(如果要直接使用NO,则添加没有它们的单独构造函数)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70745963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档