C ++入门(第5版)声明:
只包含继承构造函数的类将具有合成的默认构造函数。
这条规则背后的原因是什么?
答案 0 :(得分:6)
我认为引用可能是不安的。例如,以下内容将无法编译:
struct Base{
Base(int){}
};
struct Derived : Base{
using Base::Base;
};
int main()
{
Derived d; // error: Derived has no public default ctor!!!
}
Derived
仅包含继承的构造函数,但它没有 public 默认值!我说公开了!实际上,来自gcc
的错误消息是:
'Derived :: Derived()'被隐式删除,因为默认定义是不正确的
因此,作者的意思是,如果Derived
类继承Base
类的构造函数,将提供Derived
的默认构造函数,因为它可能必须默认初始化Derived
的数据成员无法从继承的构造函数初始化,因为他们甚至不知道它们的存在。
最后,在我的示例中,编译器已隐式删除Derived的默认ctor,因为没有人明确定义它。但是,如果您将默认的ctor添加到Base,则可以使用Derived的合成默认ctor。
答案 1 :(得分:2)
如果基类不包含没有参数的构造函数,则编译器将无法为派生类生成默认构造函数,因为它需要基类构造函数的缺少参数。但是,如果基类包含默认构造函数或不带任何参数的构造函数,则可以生成派生类的默认构造函数,通常用于调用成员变量的构造函数。目的是方便不自行编写空构造函数,如果构造函数没有做任何特殊的事情。