如果您位于派生类的构造函数中,并且未对基类构造函数进行显式调用,那么编译器如何知道要使用哪个基构造函数?构造函数如何在C++中选择一个基类构造函数
2
A
回答
3
如果在构造函数initializer list中没有提到基类,它将是default initialized。由于基类肯定是类的类型,这意味着将调用default constructor。
其中两个引用也有隐式调用基类默认构造函数的派生类的示例。例如:
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)
...
};
1
它使用默认的构造,如通过标准的在N4140 初始化碱和成员,§12.6.2[class.base.init]/8(重点煤矿)规定:
在非委托构造,如果给定的潜在的构造子对象不是由MEM-初始化-ID (包括的情况下指定其中不存在MEM-初始化列表因为构造没有ctor -initializer) 然后
如果实体是具有撑 - 或等于初始值设定的非静态数据成员,要么
- 构造的类是联合,并且没有该联盟的其他变体成员被指定为mem-initializer-id或
- 构造函数的类不是联合体,并且如果实体是匿名联合的成员,该联合的ER构件由MEM-初始化-ID指定,如在8.5指定
实体被初始化;
否则,如果实体是匿名联合或变体成员,则不执行初始化;
- 否则,实体默认初始化为。
注意,基类潜在构造每特殊成员函数子对象,§12[特殊]/5:
对于一类,它的非静态数据成员,其非 - 虚拟直接基础类,如果该类不是抽象类,则将其虚拟基类称为其潜在构造的子对象。
相关问题
- 1. C++类构造函数/析构函数
- 2. 构造函数中的调用基构造函数和其他构造函数
- 3. 呼叫基类构造函数在C#
- 4. C++ - 构造函数,其中使用的参数基类'构造函数
- 5. 从基类构造函数访问子构造函数
- 6. Move构造函数调用基类移动构造函数
- 7. 确定一个构造函数调用其基类的构造
- 8. 在构造函数中调用另一个构造函数
- 9. C++如何写一个构造函数?
- 10. 基类的拷贝构造函数(C++)
- 11. 来自基类的C++构造函数
- 12. Objective-C类构造函数
- 13. C++类构造函数()
- 14. 如何使用基类构造函数
- 15. 默认构造函数与正常构造函数的类C++
- 16. 如何将基础构造函数数据用于同一个类中的另一个构造函数?
- 17. .Net如何为分部类构造一个构造函数?
- 18. 选择类的构造函数
- 19. 在构造函数中调用不同类的构造函数?
- 20. 在构造函数中调用类成员的构造函数
- 21. 如何在其他构造函数中调用构造函数?
- 22. 如何在构造函数中访问构造函数成员?
- 23. C#构造函数
- 24. C++类,构造函数和函数
- 25. 在基类构造函数中构造对象?
- 26. 构造函数内的构造函数
- 27. 类构造函数
- 28. 构造函数可以在C++中调用另一个构造函数吗?
- 29. C++ 11:委托构造函数 - 不能选择构造函数模板?
- 30. 基类构造函数在派生类构造函数之前真的调用
它使用默认的构造函数。 –