C++ C++;:包含类实例的联合调用了错误的虚函数
在运行以下代码时,我遇到了一个奇怪的现象:C++ C++;:包含类实例的联合调用了错误的虚函数,c++,class,virtual,call,unions,C++,Class,Virtual,Call,Unions,在运行以下代码时,我遇到了一个奇怪的现象: #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() cons
#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;
}
(我基本上交换了骑士和女王的顺序)然后输出将是女王。
任何帮助都将不胜感激
谢谢
这并不意味着你认为它是什么。这相当于
any.queen.operator=(Piece::Queen());
如果any.queen
不存在,则无法可靠地工作(因为您没有强制您的union
包含活动成员)
您需要实际初始化要使用的成员,例如:
union Piece::Any {
public:
Any() {}
Piece::Knight knight;
Piece::Queen queen;
};
new (&any.queen) Piece::Queen;
首先,您的构造函数似乎没有初始化任何成员。例如,你应该选择一个
Piece::Any::Any(): knight() {}
然后根据9.5.4
通常,必须使用显式析构函数调用和placement new运算符来更改联合的活动成员
所以从骑士到女王的正确转换是
any.knight.~Knight();
new(&any.queen) Queen;
如果您觉得它很难看(对我来说也是),那么这就清楚地表明,将对象与非平凡构造函数保持在联合状态不是一个好主意(boost::variant如何?)
any.knight.~Knight();
new(&any.queen) Queen;