为什么一个具有继承构造函数的类也会得到一个合成的默认构造函数

Why would a class with inherited constructors get a synthesized default constructor as well?

本文关键字:一个 构造函数 默认 继承 为什么      更新时间:2023-10-16

C++初级读本(第5版(,第629页,说明:

只包含继承构造函数的类将具有合成的默认构造函数。

这条规则背后的原因是什么?

我认为这句话可能令人担忧。例如,以下内容将不会编译:

struct Base{
    Base(int){}
};
struct Derived : Base{
    using Base::Base;
};
int main()
{
    Derived d; // error: Derived has no public default ctor!!!
}

Derived只包含继承的构造函数,但它没有公共默认构造函数!我说过公开!实际上,来自gcc的错误消息是:

"Derived::Derived(("被隐式删除,因为默认定义是格式错误的

因此,作者的意思是,如果Derived类从Base类继承构造函数,则将为Derived提供默认构造函数,因为它可能必须默认初始化Derived的数据成员,而这些数据成员无法从继承的构造函数中初始化,因为他们甚至不知道它们的存在。

最后,在我的例子中,Derived的默认ctor已被编译器隐式删除,因为没有人显式定义它。但是,如果您将默认ctor添加到Base,则Derived合成的默认actor将可用。

如果基类不包含没有参数的构造函数,那么编译器将无法为派生类生成默认构造函数,因为它需要基类构造函数缺少的参数。然而,如果基类包含默认构造函数或不接受任何参数的构造函数,则可以为派生类生成默认构造函数,通常用于调用成员变量的构造函数。这样做的目的是,如果构造函数没有做任何特殊的事情,就可以方便地不自己编写空的构造函数。

相关文章: