考虑这段代码:
#include <string>
struct Float {
float f;
Float(float f) : f(f) {}
};
struct FloatOrString : Float {
using Float::Float;
std::string s;
FloatOrString(std::string s) : s(s) {}
};
int main() {
FloatOrString f1(1.2);
FloatOrString f2("hello");
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
错误:“FloatOrString”的构造函数必须显式初始化没有默认构造函数的基类“Float”
为什么基类中需要默认构造函数?我怎样才能避免必须提供一个?
FloatOrString不是“非此即彼”类型。正如您所写的,该类需要FloatOrStringa和a 。因此,您需要调用父构造函数,因为您必须为基类 field 提供一个值,因为您的对象必须是有效的对象(这称为里氏替换原则)。float fstd::string sfloat fFloatOrStringFloat
如果您想要“非此即彼”的设计,请std::variant改为使用,因此无需为其编写自己的类。