为什么基类需要默认构造函数?

Pib*_*ben 0 c++

考虑这段代码:

#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”

为什么基类中需要默认构造函数?我怎样才能避免必须提供一个?

Sil*_*olo 9

FloatOrString不是“非此即彼”类型正如您所写的,该类需要FloatOrStringa和a 。因此,您需要调用父构造函数,因为您必须为基类 field 提供一个值,因为您的对象必须是有效的对象(这称为里氏替换原则)。float fstd::string sfloat fFloatOrStringFloat

如果您想要“非此即彼”的设计,请std::variant改为使用,因此无需为其编写自己的类。