根据c ++规则,在定义派生类对象时,将调用基类构造函数来初始化基类成员,然后初始化派生类构造函数。对于析构函数,规则会恢复。
我想知道为什么要遵守这条规则。为什么第一个基础构造函数然后派生类构造函数?这样做有什么理由吗?或者只是因为它是c ++的定义。
谢谢,
答案 0 :(得分:8)
因为派生类的成员可能依赖于基类的成员,所以必须首先初始化基类的成员。
你不能反驳。
答案 1 :(得分:3)
类类型的对象由子对象组成 - 它的基类子对象和(非静态)数据成员。
在构建子对象之前,在其位置是原始的未初始化存储,您不能将其用作对象。
在输入对象的构造函数的主体之前构造对象的子对象,以便可以在构造函数体中使用这些子对象。
在成员子对象之前构建基类子对象只是一个规则,但可能受到以下观察的推动:
此构造顺序的技术原因是编译器通常初始化构造函数中的多态(vtable指针)所需的数据。因此,首先基类构造函数为其类初始化此函数,然后派生类构造函数将覆盖派生类的此数据。这也对应于构造函数中多态函数的行为规则。