为什么先调用基类构造函数,然后再调用派生类构造函数

why first calling base class constructor and then derived class constructor

本文关键字:调用 构造函数 派生 然后 基类 为什么      更新时间:2023-10-16

根据c++规则,在定义派生类对象时,调用基类构造函数来初始化基类成员,然后初始化派生类构造函数。对于析构函数,规则会还原。

我想知道为什么要遵守这条规则。为什么首先是基构造函数,然后是派生类构造函数?这样做有什么理由吗?或者仅仅因为它是c++的定义。

谢谢,

因为派生类的成员可能依赖于基类的成员,所以必须首先初始化基类的成员。

你不能反驳。

类类型的对象由子对象组成——它的基类子对象和(非静态)数据成员。

在构造子对象之前,它的位置是未初始化的原始存储,您不能将其用作对象。

对象的子对象是在输入该对象的构造函数主体之前构造的,因此可以在构造函数主体中使用这些子对象。

基类子对象在成员子对象之前构造只是一条规则,但可能受到以下观察结果的启发:

  • 派生对象基础对象,并添加其他成员和行为。在添加新零件之前,首先构建衍生零件所依赖的基础零件似乎是很自然的
  • 构造基类子对象时,可以通过它的常规接口使用它(多态行为除外),包括在初始化数据成员时。反之则不然:在派生对象(包括基类子对象)完全构造完成之前,不能以常规方式(通过封装成员函数)访问派生类成员

这种构造顺序的一个技术原因是编译器通常初始化构造函数中多态性(vtable指针)所需的数据。因此,首先基类构造函数为其类初始化此数据,然后派生类构造函数为派生类重写此数据。这也对应于构造函数中多态函数的行为规则。