析构函数和构造函数在C ++中排序

时间:2017-02-07 03:59:49

标签: 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

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

我知道对于继承的类,顺序是Base Constructor-&gt; Derived Constructor-&gt; Derived Destructor-&gt; Base Destructor。所以,如果D是从C继承的,那么我希望在这里订购。但是,根据我的判断,D C的子类;它只包含C类的实例。

所以在这种情况下,为什么我得到相同的输出顺序,好像DC的子类?

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

1 个答案:

答案 0 :(得分:4)

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

cD的成员,因此您会在c的构造函数体之前看到D的初始化。

破坏以与建筑相反的顺序发生。