构造函数如何选择C++中的基类构造函数
如果您在派生类的构造函数中,并且没有显式调用基类构造函数,编译器如何知道要使用哪个基类构造函数?如果构造函数中没有提到基类,那么它将被忽略。由于基类肯定是类类型,这意味着将调用 其中两个引用还包含隐式调用基类默认构造函数的派生类示例。例如:构造函数如何选择C++中的基类构造函数,c++,constructor,C++,Constructor,如果您在派生类的构造函数中,并且没有显式调用基类构造函数,编译器如何知道要使用哪个基类构造函数?如果构造函数中没有提到基类,那么它将被忽略。由于基类肯定是类类型,这意味着将调用 其中两个引用还包含隐式调用基类默认构造函数的派生类示例。例如: struct Class : public Base { unsigned char x; unsigned char y; Class ( int x ) : Base ( 123 ), // initialize b
struct Class : public Base
{
unsigned char x;
unsigned char y;
Class ( int x )
: Base ( 123 ), // initialize base class
x ( x ), // x (member) is initialized with x (parameter)
y { 0 } // y initialized to 0
{} // empty compound statement
Class ( double a )
: y ( a+1 ),
x ( y ) // x will be initialized before y, its value here is indeterminate
{} // base class constructor does not appear in the list, it is
// default-initialized (not the same as if Base() were used, which is value-init)
...
};
它使用默认构造函数,这是N4140初始化基和成员的标准§12.6.2[class.base.init]/8中规定的: 在非委托构造函数中,如果给定的潜在构造子对象未由mem初始值设定项id指定 包括没有mem初始值设定项列表的情况,因为构造函数没有ctor初始值设定项, 然后 如果实体是具有大括号或相等初始值设定项的非静态数据成员 构造函数的类是一个并集,该并集的任何其他变量成员都不会由mem初始值设定项id或 构造函数的类不是联合体,如果实体是匿名联合体的成员,则该联合体的任何其他成员都不会由mem初始值设定项id指定, 实体按照8.5中的规定进行初始化 否则,如果实体是匿名联合或变体成员,则不执行初始化 否则,该实体将默认初始化。 请注意,基类是每个特殊成员函数的潜在构造子对象,§12[特殊]/5: 对于类,其非静态数据成员、非虚拟直接基类以及(如果该类不是抽象的)其虚拟基类称为其潜在构造的子对象
它使用默认构造函数。