c++ - C++ 中的析构函数和构造函数顺序

标签 c++ class inheritance

我有一小段代码如下:

#include <iostream>

using namespace std;

class C {
public:
    C() {i = 6; cout << "C0:" << i << endl;}

    C(int i0) {i = i0; cout << "C1:" << i << endl;}

    ~C() {cout << "C2:" << i << endl;}
private:
    int i;
};

class D {
public:
    D() {cout << "D0" << endl;}
    ~D() {cout << "D1" << endl;}
private:
    C c;
};

int main(int argc, char* argv[]) {
    cout << "X" << endl;
    D d;
    cout << "Y" << endl;
}

其输出为:

X
C0:6
D0
Y
D1
C2:6

我的问题是:为什么在这种情况下 D0 之前创建 C0:6

我知道对于继承的类,顺序是基础构造函数->派生构造函数->派生析构函数->基础析构函数。所以,如果 D 是从 C 继承的,那么我会期望这里的顺序。但是,据我所知,D 不是 C 的子类;它只包含 C 类的一个实例。

那么在这种情况下,为什么我得到的输出顺序与 DC 的子类一样?

显然有一条我不理解的基本规则。

最佳答案

基类对象和成员变量(按此顺序)在构造函数体中的语句执行之前被初始化。

cD 的成员,因此您会看到 cD 的构造函数之前进行初始化 body 。

破坏的顺序与构造的顺序相反。

关于c++ - C++ 中的析构函数和构造函数顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42081485/

相关文章:

java - 在 Android 5.0.1_r1 中将 Intent 从 C++ 发送到 Java

c++ - double[][] 不等于 **double 吗?

java - 在 Java 中使用 PrintWriter 打印到文件无法使用文件名

C++ 错误 C2533,构造函数 : constructors not allowed a return type

c++ - 在模板函数中调用继承的方法

c++ - CORBA 序列内存泄漏

c++ - 使用 Boost Spirit 解析语法

C++ Runtime类切换,依赖基类继承

java - 如何对这个类进行类型转换?

java - Jackson 对象映射 - 将传入的 JSON 字段映射到基类中的 protected 属性