我有一种情况,顶级类需要一个参数,而没有子类。一些课程:
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);
当然,如果没有办法,就没有办法,但是有吗?
答案 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)