为什么先调用基类构造函数,然后调用派生类构造函数 根据C++规则,定义派生类对象时,调用基类构造函数初始化基类成员,然后初始化派生类构造函数。对于析构函数,规则将恢复

为什么先调用基类构造函数,然后调用派生类构造函数 根据C++规则,定义派生类对象时,调用基类构造函数初始化基类成员,然后初始化派生类构造函数。对于析构函数,规则将恢复,c++,constructor,destructor,C++,Constructor,Destructor,我想知道为什么要遵守这条规则。为什么先是基构造函数,然后是派生类构造函数?有什么理由这样做吗?或者仅仅因为它是C++的定义。 谢谢,因为派生类的成员可能依赖于基类的成员,所以必须首先初始化基类的成员 你不能提出相反的观点。类类型的对象由子对象组成——它的基类子对象和(非静态)数据成员 在构造子对象之前,取而代之的是未初始化的原始存储,您不能将其用作对象 对象的子对象是在输入对象的构造函数体之前构造的,因此可以在构造函数体中使用这些子对象 基类子对象是在成员子对象之前构造的,这只是一条规则,但可能

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

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


你不能提出相反的观点。

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

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

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

基类子对象是在成员子对象之前构造的,这只是一条规则,但可能是由以下观察结果引起的:

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

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

“定义派生类对象时,调用基类构造函数来初始化基类成员,然后初始化派生类构造函数”和“为什么先初始化派生构造函数,然后再初始化基类构造函数?”?"…你似乎很困惑…@Plasmah,非常感谢。我已经更新了它。哦,这不是你应该遵守的规则,而是语言的工作方式,你对此无能为力。这就引出了一个问题。从本质上来说,派生类的数据成员对包含它们的对象/类一无所知,更不用说基类成员了如果构造顺序相反,我可以在初始化基类时使用派生成员。核心参数是在派生构造函数体中使用成员函数(前提是完全构造的子对象)的能力。