C++ 我能做些什么,使超构造函数的参数隐式传递吗?
我遇到的情况是,顶级类需要一个参数,而所有子类都不需要。某些类别:C++ 我能做些什么,使超构造函数的参数隐式传递吗?,c++,oop,inheritance,constructor,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 ca
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);
当然,如果没有办法,也没有办法,但是有办法吗?如果您的问题是您有一组特定的子类,所有这些子类都需要使用相同的默认参数调用
超类
构造函数,那么您所需要做的就是引入一个没有参数构造函数的中介体,它将调用带有幻数的SuperClass::SuperClass
。将参数设置为默认值
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'.
};
所有派生类都必须向基类传递一些值。派生类很容易在
protected
部分的基类中有一个默认构造函数。可以初始化对派生类有意义的基类的成员数据
class SuperClass {
public:
SuperClass(const int parameter);
protected:
SuperClass() : SuperClass(10) {} // Delegate to the other constructor.
}
您可能需要更改默认的子构造函数:
class NoParametersInConstructorClass : public SuperClass {
public:
NoParametersInConstructorClass(int n =0) : SuperClass(n)someText("Hello") {};
private:
std::string someText
}
class NoParametersInConstructorClass : public SuperClass {
public:
using SuperClass::SuperClass;
NoParametersInConstructorClass() : someText("Hello") {};
private:
std::string someText
}
通过这种方式,
无参数构造函数或类变量(66)代码>和无参数构造函数类变量代码>将起作用。要回答您编辑的问题:
您可以使用using
关键字使派生类使用基类构造函数:
class NoParametersInConstructorClass : public SuperClass {
public:
NoParametersInConstructorClass(int n =0) : SuperClass(n)someText("Hello") {};
private:
std::string someText
}
class NoParametersInConstructorClass : public SuperClass {
public:
using SuperClass::SuperClass;
NoParametersInConstructorClass() : someText("Hello") {};
private:
std::string someText
}
您必须以某种方式为派生类定义构造函数。如果没有using
语句,您不能只调用派生类的基类构造函数。假设您不能(或不会)修改基类以添加默认构造函数,您必须在每个派生类的初始化列表中以其有效形式(带参数)调用基类的构造函数(如)您能给我们看一下您的实际代码吗?子类似乎不继承基类,所以我不确定是否理解您的问题。如果您想这样做,可以在子类中显式调用超类构造函数超类(5)
。假设您的子类继承自需要参数的基类,那么在不给它参数的情况下,您希望如何调用它的构造函数?编译器应该使用随机数吗?@JameyD很抱歉,我刚刚忘记编写:公共超类
。我目前正在使用显式调用。我的实际代码与您看到的代码几乎相同,只是名称是Graph
,BigGraph
和sevelar类似,参数是GraphData*
。因此,我想不需要再看到任何实际的代码了。您只需从基类构造函数中删除参数,并在该基类构造函数中使用一个常量,这样每个派生类也会使用一个常量。但是,如果每个派生类的参数需要不同,那么就没有其他方法了。听起来像是坏继承。派生类真的满足多态性的is-a要求吗?如果基类真的需要这个参数,那么子类怎么能忽略它呢?