次のコードを実行すると、別のアドレスが出力されます。なんで?
class Base1 {
int x;
};
class Base2 {
int y;
};
class Derived : public Base1, public Base2 {
};
union U {
Base2* b;
Derived* d;
U(Base2* b2) : b(b) {}
};
int main()
{
Derived* d = new Derived;
cout << d << "\n";
cout << U(d).d << "\n";
return 0;
}
さらに楽しいのは、このように、ユニオンに繰り返し出入りする場合、アドレスが4ずつ増加し続けることです。
int main()
{
Derived* d = new Derived;
cout << d << "\n";
d = U(d).d;
cout << d << "\n";
d = U(d).d;
cout << d << "\n";
return 0;
}
ユニオンをこのように変更すると、問題は解決します
union U {
void* v;
Base2* b;
Derived* d;
U(void* v) : v(v) {}
};
また、いずれかの基本クラスを空にすると、問題は解決します。これはコンパイラのバグですか?私はそれが私のポインターを地獄だけに残して欲しいです。