我可以做一些事情,以便隐式传递超级构造函数的参数吗?

时间:2016-01-14 16:04:02

标签: c++ oop inheritance constructor

我有一种情况,顶级类需要一个参数,而没有子类。一些课程:

class SuperClass {
public:
    SuperClass(const int parameter);
}

这是孩子:

class NoParametersInConstructorClass : public SuperClass {
public:
    // This will cause an error:
    // error: no matching function for call to 'SuperClass::SuperClass(const int)'
    NoParametersInConstructorClass() : someText("Hello") {};
private:
    std::string someText
}

现在我面临的问题是我确实有一个初始化列表,但我觉得重写所有子类中的参数很繁琐。我知道,我很懒。我希望这可以在没有明确定义的情况下工作:

// Works even though NoParametersInConstructorClass(const int) isn't defined
NoParametersInConstructorClass variable(66);

当然,如果没有办法,就没有办法,但是有吗?

6 个答案:

答案 0 :(得分:2)

所有派生类都必须将一些值传递给基类。派生类很容易在protected部分的基类中有一个默认构造函数。您可以初始化对派生类有意义的基类的成员数据。

class SuperClass {
  public:
    SuperClass(const int parameter);
  protected:
    SuperClass() : SuperClass(10) {} // Delegate to the other constructor.
}

答案 1 :(得分:0)

如果您的问题是您有一组特定的子项,所有这些子项都需要使用相同的默认参数调用SuperClass构造函数,那么您需要做的就是引入一个没有参数的中介构造函数,它将使用幻数调用SuperClass::SuperClass

答案 2 :(得分:0)

使参数默认。

class SuperClass {
public:
    SuperClass(const int parameter = DEFAULT);
}

然后,您可以选择在初始化列表中包含构造函数,或使用默认值。

默认值:

class NoParameterChildDefault : public SuperClass
{
public:
   NoParameterChildDefault() : someText("Hello") { ... } // uses value DEFAULT.
};

明确价值:

class NoParameterChildExplicit : public SuperClass
{
public:
  NoParameterChildExplicit() : SuperClass(5), someText("Hello") { ... } // uses value '5'.
};

答案 3 :(得分:0)

您可能想要更改默认的子构造函数:

class NoParametersInConstructorClass : public SuperClass {
public:
    NoParametersInConstructorClass(int n =0) : SuperClass(n)someText("Hello") {};
 private:
    std::string someText
}

这样NoParametersInConstructorClass variable(66);NoParametersInConstructorClass variable;都可以使用。

答案 4 :(得分:0)

回答您编辑过的问题: 您可以使用using关键字使派生类使用基类构造函数:

class NoParametersInConstructorClass : public SuperClass {
public:
    using SuperClass::SuperClass;
    NoParametersInConstructorClass() : someText("Hello") {};
private:
    std::string someText
}

您必须以某种方式为派生类定义构造函数。您不能在没有using语句的情况下调用派生类的基类构造函数。

答案 5 :(得分:0)

假设您不能(或者您不会)修改基类以添加默认构造函数,您必须以其有效形式调用基类的构造函数(使用在每个派生类的初始化列表中(如here