繁体   English   中英

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

[英]why first calling base class constructor and then derived class constructor

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

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

谢谢,

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

你不能争论相反。

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

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

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

在成员子对象只是一个规则之前构造了这个基类子对象,但可以通过以下观察来激励:

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

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

暂无
暂无

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

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