如何避免在C ++中显式构造在初始化列表中继承的所有内容?

时间:2019-02-19 02:28:38

标签: c++ constructor multiple-inheritance

构造对象D时,我需要在初始化列表中包括A,B和C的构造函数。有什么方法可以使我不需要初始化列表中的全部三个?

如果我尝试仅使用BI的构造函数初始化D,则会收到错误,因为我没有A或C的默认构造函数。如果我添加了A和CI的默认构造函数,则会出现“ i”被重新初始化的问题没有价值。

#include <iostream>
using namespace std;

class A 
{
    int i;
public:
    A(int ii) :
        i(ii)
    {}

    ~A() { }

    int getI() { return i; }
};

class B : public virtual A
{
public:
    B(int ii) :
        A(ii)
    { }

    ~B() { }
};

class C : public virtual A 
{
public:
    C(int ii) :
        A(ii)
    { }

    ~C() { }
};

class D : public B, public C 
{
public:
    D(int ii) :
        A(ii), B(ii), C(ii)
    { }
    ~D() { }

 };

int main() 
{
    D d(45);
    cout << d.getI() << endl;
}

3 个答案:

答案 0 :(得分:1)

如果将默认构造函数添加到ABC,则D的实现会变得更加简单。

#include <iostream>
using namespace std;

class A 
{
   int i;
   public:
   A() : i(0) {}
   A(int ii) : i(ii) {}

   ~A() { }

   int getI() { return i; }
};

class B : public virtual A
{
   public:
      B() { }
      B(int ii) : A(ii) { }

      ~B() { }
};

class C : public virtual A 
{
   public:
      C() { }
      C(int ii) : A(ii) { }

      ~C() { }
};

class D : public B, public C 
{
   public:

      // Relies on default constructors of the other classes.
      D() { }

      // Relies on the default constructors of B and C.
      D(int ii) : A(ii) { }
      ~D() { }

};

int main() 
{
   D d1(45);
   D d2;
   cout << d1.getI() << endl;
   cout << d2.getI() << endl;
}

答案 1 :(得分:0)

恐怕不是。使用虚拟继承时,您派生最多的类必须初始化虚拟基。

了解更多here

答案 2 :(得分:0)

如何将默认值添加到A,B,C构造函数,即

A(int ii=0) :