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

标签 c++ constructor multiple-inheritance

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

如果我尝试仅使用 B 的构造函数来初始化 D,我会收到错误消息,因为我没有 A 或 C 的默认构造函数。如果我为 A 和 C 添加默认构造函数,我会遇到重新初始化“i”的问题没有值(value)。

#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;
}

最佳答案

如果将默认构造函数添加到ABCD 的实现就变成了简单一点。

#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;
}

关于c++ - 如何避免在 C++ 中显式构造初始化列表中继承的所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54758024/

相关文章:

c++ - 命名包括 guard

Java ORM : Multiple (interface) inheritance

c++ - 我应该如何读取 FILE_NOTIFY_INFORMATION 结构中的文件名

c++ - 在 C++ 中输入大货币值

c++ - 如何使用 weak_ptr 构造一个包含对父对象的引用的对象?

c# - 静态构造函数中的异常

C# - 为什么无法在字段初始值设定项中访问 'this'?

c++ - 多重继承的派生类 : How to reuse derived functions without repeating calls to base

c++ - 多重继承和不可访问的默认构造函数

c++ - 加载非标准字体并在 QTextDocument 中显示它们