gpt4 book ai didi

c++ - 解释此 C++ 代码中构造函数/析构函数调用的顺序

转载 作者:搜寻专家 更新时间:2023-10-31 00:30:24 24 4
gpt4 key购买 nike

我有这个 C++ 代码:

class BaseClass {
int id;
public:
BaseClass() { printf("BaseClass()\n"); }
virtual ~BaseClass() { printf("~BaseClass()\n"); }
};

class Class1 : public BaseClass
{
int id;
public:
Class1() { printf("Class1()\n"); }
~Class1() { printf("~Class1()\n"); }
};

class Class2 : public Class1
{
BaseClass id;
public:
Class2() { printf("Class2()\n"); }
~Class2() { printf("~Class2()\n"); }
};

class Class3 : virtual public BaseClass
{
int id;
public:
Class3() { printf("Class3()\n"); }
~Class3() { printf("~Class3()\n"); }
};

class Class4 : public Class3, virtual public Class1
{
Class3 id;
public:
Class4() { printf("Class4()\n"); }
~Class4() { printf("~Class4()\n"); }
};

int main(int argc, char* argv[])
{
BaseClass *p = new Class2;
Class2 *p1 = new Class2;
Class3 *p2 = new Class3;
delete p;
delete p1;
delete p2;
return 0;
}

这是输出:

BaseClass()
Class1()
BaseClass()
Class2()
BaseClass()
Class1()
BaseClass()
Class2()
BaseClass()
Class3()
~Class2()
~BaseClass()
~Class1()
~BaseClass()
~Class2()
~BaseClass()
~Class1()
~BaseClass()
~Class3()
~BaseClass()

我不明白为什么。我希望输出如下:

BaseClass()
Class1()
Class2()
BaseClass()
Class1()
Class2()
...

等等

为什么在创建p1 时,Class2() 没有在Class1() 之后打印?这与虚拟继承有关吗?

最佳答案

Why isn't Class2() printed after Class1() when creating, for example, p1?

因为 Class2有一个类型为 BaseClass 的非静态成员对象, 它的 ctor 将在 Class2 的 ctor 之前被调用.

根据initialization order :

Initialization order

1) If the constructor is for the most-derived class, virtual base classes are initialized in the order in which they appear in depth-first left-to-right traversal of the base class declarations (left-to-right refers to the appearance in base-specifier lists)

2) Then, direct base classes are initialized in left-to-right order as they appear in this class's base-specifier list

3) Then, non-static data members are initialized in order of declaration in the class definition.

4) Finally, the body of the constructor is executed

对于 new Class2; , 直接基类 Class1及其基类 BaseClass将首先被调用。然后是非静态数据成员 id与类型 BaseClass将被调用。和Class2的ctor的 body |最后会被调用。所以你会得到

BaseClass()
Class1()
BaseClass()
Class2()

关于c++ - 解释此 C++ 代码中构造函数/析构函数调用的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37089259/

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