如何在derived类中初始化需要构造函数参数的成员对象?

How to initialize member objects that requires constructor parameters in derived classes?

我想在我的 Base class 中包含一个 Composed 对象,并且不同的派生 class 对象具有不同的配置。但是 Composed class 需要构造函数中的参数,我无法控制它的架构。

编译器报错,因为 Composed 的参数应该在 Base class 的初始化时传递。但我只希望它在派生的 classes 中被初始化。这种情况怎么办?

class Base{
  public:
    Base(); //Error
  protected:
    Composed comp;
};
class Composed{
  public:
    Composed(int id):id(id);
  private:
    int id;
};
class Derived_1:public Base{
  public:
    Derived():comp(1234){};
};    
class Derived_2:public Base{
  public:
    Derived():comp(2345){};
};   

您必须将该参数传递给 Base,然后传递给 comp:

class Composed{
  public:
    Composed(int id):id(id);
  private:
    int id;
};
class Base{
  public:
    Base(int id):comp(id){}
  protected:
    Composed comp;
};
class Derived_1:public Base{
  public:
    Derived():Base(1234){};
};    
class Derived_2:public Base{
  public:
    Derived():Base(2345){};
}; 

有几个选项。最直接的就是将构建 Comp 所需的对象传递给 Base class 构造函数。

class Base{
  public:
    Base(int id):comp(id){}
protected:
    Composed comp;
};

class Derived_1:public Base{
  public:
    Derived():Base(1234){}
};    
class Derived_2:public Base{
  public:
    Derived():Base(2345){}
};   

另一种可能性是不将 Comp 包含在基数中 class。把它放在每个导出的 class 中。您可以将纯虚函数添加到 returns Comp(或其地址)的 Base class。

另一种选择是存储一个指向 Comp 的指针(可能是 unique_ptr)并将其分配到派生的 classes 中。

假设您构建了一个 Base 对象。它怎么知道要传递给 comp 的构造函数的参数是什么? Base class 存在根本性缺陷,这就是您出现错误的原因。它需要知道如何构造它的 Composed 成员对象。

您可以为Composed添加一个默认构造函数,然后在Derived_1Derived_2中修改这个对象。或者,正如其他人所建议的那样,您可以让 Base 的构造函数采用参数来构造 comp。这听起来更适合我,但这取决于您的用例。

请记住,当您构造 Derived_1Derived_2 时,Base class 是第一个被创建的东西,在其他成员变量之前。