Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:包含类实例的联合调用了错误的虚函数_C++_Class_Virtual_Call_Unions - Fatal编程技术网

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;