Я столкнулся со странным явлением при запуске следующего кода:
#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;
};
(я в основном поменял местами рыцаря и королеву), то на выходе получилось бы Queen.Любая помощь будет оценена.
Спасибо