为什么一个具有继承构造函数的类也会得到一个合成的默认构造函数
Why would a class with inherited constructors get a synthesized default constructor as well?
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将可用。
如果基类不包含没有参数的构造函数,那么编译器将无法为派生类生成默认构造函数,因为它需要基类构造函数缺少的参数。然而,如果基类包含默认构造函数或不接受任何参数的构造函数,则可以为派生类生成默认构造函数,通常用于调用成员变量的构造函数。这样做的目的是,如果构造函数没有做任何特殊的事情,就可以方便地不自己编写空的构造函数。
相关文章:
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 如何处理没有默认构造函数但在另一个构造函数中构造的对象?
- 我用字符串做了一个C++构造函数,但它不会打印出字符串
- 有一个构造函数,但有两个析构函数
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- C 如何仅实现多个继承类的一个构造函数
- 错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换.即使我有一个构造函数
- 让构造函数在其初始化列表中调用同一类的另一个构造函数是否有效
- 创建一个构造函数,即Capabe获取任何数量的参数
- 我如何在类上需要另一个构造函数的对象中声明一个对象
- 使用委托调用构造函数和在另一个构造函数体中调用的区别
- 为什么当我尝试编译时,我的 c++ 代码不断返回对我的一个构造函数的"未定义的引用"?
- C :另一个构造函数的构造函数的隐式调用
- 如何创建一个构造函数,该构造函数吸收char阵列
- 为什么有一个构造函数同时接受initializer_list和一个参数包
- 我有一个构造函数,但我需要将输出返回到 main.cpp.我无法使用获取字符串功能!!任何想法如何实现这一目标?
- 如何在一个构造函数中使用两个可变参数模板参数来绑定两个函数
- 从同一类的另一个构造函数调用构造函数
- 将类的实例传递给另一个构造函数,该构造函数将其对象添加到所传递实例所拥有的列表中