gpt4 book ai didi

c++ - 一个类派生自三个基类的 "diamond problem"中的构造顺序是什么?

转载 作者:行者123 更新时间:2023-12-05 01:05:13 26 4
gpt4 key购买 nike

下面是我所问的示例代码。输出将是 XXbBACY,但我不明白为什么。

#include <iostream>
using namespace std;

class X {
public:
X() { cout << 'X'; }
X(char c) { cout << 'X' << c; }
};

class A : virtual X {
public:
A() : X('a') { cout << 'A'; }
};

class B : X {
public:
B() : X('b') { cout << 'B'; }
};

class C : virtual X {
public:
C() : X('c') { cout << 'C'; }
};

class Y : A, virtual B, C {
public:
Y() { cout << 'Y'; }
~Y() {}
};

int main() {
Y y;
return 0;
}

据我了解,当我们创建类 Y 的对象 y 时,由于并非所有基类都虚拟派生自类 X(特别是 B),因此 Y 中将有 3 个类 X 的实例。

构造对象 y 时调用的第一个构造函数将是类 B 的构造函数,因为它实际上是从类 Y 派生的,但在构造类 B 之前,必须创建类 X 的实例,因为 B() : X('b') { cout << 'B'; }是B类的默认构造函数,X(char c) { cout << 'X' << c; }将在 X 类中调用。它将打印 Xb。现在我们返回到 B 类,默认构造函数将打印 B,然后返回到 Y 类

现在将类似地构造一个 A 类和 C 类的实例,给我们留下以下输出:XbBXaAXcCY

我的理解好像完全错了,因为输出的是XXbBACY,怎么会这样呢?

最佳答案

构造顺序总是这样:

  1. 首先是所有(直接或间接)虚基,按深度优先声明顺序排列。显然至多是任何类型中的一种。
  2. 接下来是声明顺序的非虚基。
  3. 声明顺序中的所有其他成员。
  4. 最后是 ctor 正文。现在您可以安全地直接或间接调用虚函数,它们将根据当前运行的 ctor 进行解析。

在你的情况下,这意味着:

  1. 虚拟 X 来自 Y::A::X
  2. virtual B from Y::B:
    (第一步:X from Y::B::X。)
  3. A 来自 Y::AX 虚拟基础已经完成。
  4. C 来自 Y::CX 虚拟基础已经完成。

破坏顺序与此相反。

关于c++ - 一个类派生自三个基类的 "diamond problem"中的构造顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70832007/

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