繁体   English   中英

构造函数如何选择C ++中的基类构造函数

[英]How does a constructor choose a base class constructor in C++

如果您在派生类的构造函数内部,并且没有对基类构造函数进行显式调用,则编译器如何知道要使用哪个基本构造函数?

如果构造函数初始化器列表中未提及基类,则将默认对其进行初始化 由于基类肯定是类类型的,这意味着将调用默认构造函数

这些引用中的两个还具有派生类的示例,这些派生类隐式调用基类的默认构造函数。 例如:

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-initializer-id指定(包括由于构造函数没有ctor-initializer而没有mem-initializer-list的情况),则

  • 如果实体是具有大括号或相等初始化程序的非静态数据成员,并且

    • 构造函数的类是一个联合,并且该联合的其他任何变体成员都不由mem-initializer-id
    • 构造函数的类不是联合体,并且,如果实体是匿名联合体的成员,则该联合体的其他任何成员都不会由mem-initializer-id指定

    该实体已按照8.5中的规定进行了初始化;

  • 否则,如果实体是匿名联合或变量成员,则不执行初始化;

  • 否则,实体是默认初始化的

请注意,根据特殊成员函数 §12[special] / 5,基类是潜在构造的子对象:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM