5

根据c++规则,定义派生类对象时,先调用基类构造函数初始化基类成员,再调用派生类构造函数。对于析构函数,规则恢复。

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

谢谢,

4

2 回答 2

8

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

你不能反驳相反的观点。

于 2013-02-12T16:33:05.470 回答
3

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

在构造子对象之前,取而代之的是未初始化的原始存储,您不得将其用作对象。

对象的子对象是在对象的构造函数体进入之前构造的,这样就可以在构造函数体中使用这些子对象。

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

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

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

于 2013-02-12T16:55:40.433 回答