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

时间:2015-07-28 09:17:15

标签: c++ c++11 inheritance

第629页的

C ++入门(第5版)声明:

  

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

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

2 个答案:

答案 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)

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