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

问题描述 投票:1回答:3

当我构造一个对象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;
}
c++ constructor multiple-inheritance
3个回答
1
投票

如果你向qazxsw poi,qazxsw poi和A添加默认构造函数,B的实现会变得有点简单。

C

0
投票

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

阅读更多D


0
投票

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

#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;
}
© www.soinside.com 2019 - 2024. All rights reserved.