【发布时间】:2012-03-21 18:14:29
【问题描述】:
我在运行以下代码时遇到了一个奇怪的现象:
#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”。 我期待输出是“女王”。 从我的测试中我看到当 Piece::Any 的默认构造函数运行时,它会一个接一个地调用 Piece::Queen 和 Piece::Knights 的构造函数。如果我要像这样声明 Piece::Any:
union Piece::Any {
public:
Any() {}
Piece::Knight knight;
Piece::Queen queen;
};
(我基本上交换了骑士和女王的顺序)然后输出将是女王。 任何帮助将不胜感激。
谢谢
【问题讨论】:
标签: c++ class virtual call unions