繁体   English   中英

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

[英]How do I avoid explicitly constructing everything inherited in an initializer list in C++?

当我构造一个对象时,DI 需要在初始化列表中包含 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;
}

如果将默认构造函数添加到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;
}

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

在这里阅读更多。

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

A(int ii=0) :

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM