为什么先调用基类构造函数,然后再调用派生类构造函数
why first calling base class constructor and then derived class constructor
根据c++规则,在定义派生类对象时,调用基类构造函数来初始化基类成员,然后初始化派生类构造函数。对于析构函数,规则会还原。
我想知道为什么要遵守这条规则。为什么首先是基构造函数,然后是派生类构造函数?这样做有什么理由吗?或者仅仅因为它是c++的定义。
谢谢,
因为派生类的成员可能依赖于基类的成员,所以必须首先初始化基类的成员。
你不能反驳。
类类型的对象由子对象组成——它的基类子对象和(非静态)数据成员。
在构造子对象之前,它的位置是未初始化的原始存储,您不能将其用作对象。
对象的子对象是在输入该对象的构造函数主体之前构造的,因此可以在构造函数主体中使用这些子对象。
基类子对象在成员子对象之前构造只是一条规则,但可能受到以下观察结果的启发:
- 派生对象是基础对象,并添加其他成员和行为。在添加新零件之前,首先构建衍生零件所依赖的基础零件似乎是很自然的
- 构造基类子对象时,可以通过它的常规接口使用它(多态行为除外),包括在初始化数据成员时。反之则不然:在派生对象(包括基类子对象)完全构造完成之前,不能以常规方式(通过封装成员函数)访问派生类成员
这种构造顺序的一个技术原因是编译器通常初始化构造函数中多态性(vtable指针)所需的数据。因此,首先基类构造函数为其类初始化此数据,然后派生类构造函数为派生类重写此数据。这也对应于构造函数中多态函数的行为规则。
相关文章:
- 在c++中使用向量时,如何调用构造函数和析构函数
- C++:考虑但不调用构造函数的特殊性
- 对象实例化调用构造函数的次数太多
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C ++:通过大括号调用构造函数?
- 不能调用构造函数
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- 在模板化类的构造函数中调用构造函数
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 我不明白在这个例子中什么时候调用构造函数
- 调用c++构造函数的不同方法
- 调用构造函数与将内联常量定义为默认参数
- 如何通过 Rust FFI 调用C++构造函数?
- "new"运算符是否总是调用构造函数?
- 无法调用构造函数
- 使用 "()" 调用构造函数不同于"{}"
- 确定是调用构造函数还是强制转换运算符的因素