构造函数如何选择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:

对于类,其非静态数据成员、非虚拟直接基类以及(如果该类不是抽象的)其虚拟基类称为其潜在构造的子对象


它使用默认构造函数。