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

标签 c++ c++11 inheritance

C++ Primer(第 5 版)第 629 页指出:

A class that contains only inherited constructors will have a synthesized default constructor.

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

最佳答案

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

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()' is implicitly deleted because the default definition would be ill-formed

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

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

关于c++ - 为什么具有继承构造函数的类也会获得合成的默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31672134/

相关文章:

java - 使用 Java 多态性限制对方法调用的访问

c++ 操作系统独立(windows 和 linux)开源随机数生成器库?

c++ - 为什么我会收到这个超出范围的错误

c++ - C++11 标准和免费草稿 N3337 之间的节号是否不同?

c++ - unordered_map 值类型为 reference_wrapper 时的赋值

c# - 基类的方法总是被调用

c++ - 如何在 C++/QT 中创建 Windows 服务?

c++ - 如何将在 OS X 中开发的 Qt 应用程序部署到 Windows?

c++ - 第一个 rand() 在 srand(time(0)) 之后生成相同的值

java - 为什么Parent类的实例变量的变化会反射(reflect)在Child类中?