gpt4 book ai didi

C++:包含类实例的 union 会调用错误的虚函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:31:06 25 4
gpt4 key购买 nike

我在运行以下代码时遇到了一个奇怪的现象:

#include <iostream>    

class Piece {
public:
class Queen;
class Knight;
union Any;
virtual const char* name() const = 0;
};

class Piece::Queen : public Piece {
public:
virtual const char* name() const {
return "Queen";
}
};

class Piece::Knight : public Piece {
public:
virtual const char* name() const {
return "Knight";
}
};

union Piece::Any {
public:
Any() {}
Piece::Queen queen;
Piece::Knight knight;
};

using namespace std;
int main(int argc, const char* argv[]) {
Piece::Any any;
any.queen = Piece::Queen();
cout << any.queen.name() << endl;

return 0;
}

该程序在 Apple LLVM 3.0 编译器上编译成功,但输出为“Knight”。我期待输出为“Queen”。从我的测试中我看到,当 Piece::Any 的默认构造函数运行时,它会依次调用 Piece::Queen 和 Piece::Knights 的构造函数。如果我像这样声明 Piece::Any :

union Piece::Any {
public:
Any() {}
Piece::Knight knight;
Piece::Queen queen;
};

(我基本上调换了骑士和王后的顺序)那么输出就是王后。任何帮助将不胜感激。

谢谢

最佳答案

首先 - 你的构造函数似乎没有初始化它的任何成员。你应该选择一个,例如

Piece::Any::Any(): knight() {}

然后根据9.5.4

In general, one must use explicit destructor calls and placement new operators to change the active member of a union

所以从骑士到女王的正确切换是

any.knight.~Knight();
new(&any.queen) Queen;

如果它对你来说看起来很丑(就像对我一样),这清楚地表明,将对象与非平凡的构造函数保持在 union 中并不是一个好主意(boost::variant 怎么样?)。

关于C++:包含类实例的 union 会调用错误的虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9546914/

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