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

时间:2016-02-26 10:41:47

标签: c++ inheritance constructor composition

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

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

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){};
};   

3 个答案:

答案 0 :(得分:4)

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

SELECT link FROM `images` WHERE uid='85';  

答案 1 :(得分:2)

想象一下,您构建了一个Base对象。它如何知道要传递给comp的构造函数的参数? Base类基本上存在缺陷,这就是您遇到错误的原因。它需要知道如何构造它的Composed成员对象。

您可以为Composed添加默认构造函数,然后在Derived_1Derived_2中修改此对象。或者,正如其他人所建议的那样,您可以使Base的构造函数获取参数来构造comp。这听起来比我好,但这取决于你的用例。

请记住,在构建Derived_1Derived_2时,Base类是在其他成员变量之前创建的第一个类。

答案 2 :(得分:1)

有几个选择。最简单的方法是将构建Comp所需的对象传递给Base类构造函数。

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。把它放在每个派生类中。您可以将纯虚函数添加到返回Comp(或其地址)的Base类。

另一个选择是存储指向Comp的指针(可能是unique_ptr)并在派生类中分配它。