gpt4 book ai didi

c++ - 关于构造函数调用和继承顺序的一些困惑

转载 作者:行者123 更新时间:2023-11-28 05:10:42 25 4
gpt4 key购买 nike

我有以下代码:

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的构造函数。

而且析构函数的调用顺序是构造函数调用的逆序

有谁能告诉我为什么先调用B的构造函数,最后调用B的析构函数?

最佳答案

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

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

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

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


然后在 C 构造函数中,你说 new A 调用 A 的构造函数,它给你 A-C后跟 C-C

然后,类 D 的数据成员 ab 被初始化,它们都是对象,所以两个构造函数都被调用,给你 A-CB-C

最后,D 构造函数被调用,以 D-C 结束。

关于c++ - 关于构造函数调用和继承顺序的一些困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43561828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com