派生类构造函数如何在内部调用基类构造函数
How derived class constructor calls base class constructor internally
#include <iostream>
#include <string>
using namespace std;
class A
{
private:
int ai;
string as;
};
class B : public A
{
private:
int bi;
string bs;
};
int main()
{
B bob;
return 0;
}
类A和B有默认构造函数。我知道类A的默认构造函数会先被调用然后是类B的默认构造函数。但问题是这是如何在内部发生的?数据成员是否按照继承顺序构造?编译器如何/在哪里从派生函数调用基函数?
基本上是先初始化基类,然后按声明顺序初始化数据成员。一个例外是虚拟基类,它首先从最派生的类初始化。另一个例外是委托构造函数。
标准:在c++ 11中,这由§12.6.2/10:
规定" 在非委托构造函数中,初始化按照以下顺序进行:
- 首先,并且仅对最派生类的构造函数(1.8)初始化虚基类它们在基类的有向无环图从左到右的深度优先遍历中出现的顺序,其中"从左到右"是派生类base- specific -list中基类的出现顺序。
然后,直接基类按照它们出现在base-specifier-list中的声明顺序初始化。(不管mem初始化式的顺序)。然后,按照在类定义中声明的顺序初始化非静态数据成员(同样,不管mem初始化式的顺序)。最后,执行构造函数体的复合语句。[注意:声明顺序是强制的,以确保基子对象和成员子对象在初始化的反向顺序。 -end note]
至于这在内部是如何工作的,一种常用的技术是构造函数调用其关联的基和普通成员构造函数。如果忽略虚拟基和构造函数委托,并考虑类T的实例化,那么在实例化T时,首先发生的是调用T构造函数。但这还不是T实例本身的初始化。执行仍然在该构造函数的内存初始化列表中。在这里,它调用各种基和非基成员构造函数(在这里也会递归地发生相同的情况)。最后执行构造函数体。
相关文章:
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 减少复制构造函数调用
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 在 Google 测试中,我可以从构造函数调用 GetParam() 吗?
- C++ - 从另一个类构造函数调用类构造函数
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- 是否可以从移动构造函数调用默认构造函数?
- 在模板生成器模式中分解重复的构造函数调用
- std::atexit 从全局对象的构造函数调用时的排序
- 对构造函数调用的约束
- 编译器错过了无效的构造函数调用,并调用不存在的(或私有的)默认构造函数
- 用构造函数调用填充向量
- 创建指针时是否没有构造函数调用
- 使用 emplace_back 避免移动构造函数调用的最佳方法?
- C++ 抽象类构造函数调用
- 为什么函数参数将带有参数的构造函数调用
- 为什么比“构造函数”调用更多的“解构器”调用
- 将对象传递给函数并不是导致构造函数调用