关于构造商的呼叫和继承顺序的混乱

Some confusion about the order of constructor call and inheritance

本文关键字:继承 顺序 混乱 呼叫 于构造      更新时间:2023-10-16

我有以下代码:

class A {
    public:
        A() { cout << "A-C" << endl; }
        ~A(){ cout << "A-D" << endl; }
};
class B {
    public:
        B() { 
            cout << "B-C" << endl; 
        }
        ~B() { 
            cout << "B-D" << endl; 
        } 
};
class C {
    protected:
        A* a;
        B b;
    public: 
        C() {
              a = new A;
              cout << "C-C" << endl; 
            }
        ~C() { 
            delete a;
            cout << "C-D" << endl; 
        }
};
class D : public C {
    protected:
        A a;
        B b;
    public:
        D(){ cout << "D-C" << endl; }
        ~D(){ cout << "D-D" << endl; }
};
int main() {
    D* d = new D;
    B* b = new B;
    delete b;
    delete d;
    system("pause");
    return 0;
}

我对输出的最初想法是:

A-C
C-C
A-C
B-C
D-C
B-C
B-D
D-D
B-D
A-D
A-D
C-D

但这是错误的。输出实际上是:

B-C
A-C
C-C
A-C
B-C
D-C
B-C
B-D
D-D
B-D
A-D
A-D
C-D
B-D

我不知道为什么该程序首先将其称为B的构造函数及其破坏者。我认为构造函数呼叫的顺序应该这样:C的构造函数 -> a的构造函数 -> b的构造函数 -> d的构造函数。

destructor调用的顺序是构造函数调用的相反顺序

任何人都可以告诉我为什么B在开头调用B的构造函数,而B的destuructor终于被调用了?

B-C
A-C
C-C
A-C
B-C
D-C

所有这些都是由D* d = new D;引起的。

D构造函数调用C构造函数,因为CD的基础。

然后,C类的数据成员ab是初始化的,a是一个指针,因此尚无构造函数调用该数据成员。b是类型B的对象,因此B无参数构造器被调用,为您提供第一个B-C


然后在C构造函数中您说的new A调用A的构造函数,该构造器为您提供A-C,其次是C-C

然后,DATA成员a和D类的b都是初始化的,两个都是对象,因此两个构造函数都被称为对象,从而为您提供A-CB-C

最后,D构造函数被称为,用D-C结束。