如果我运行以下代码,我会打印出不同的地址。为什么?
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) {}
};
此外,如果任一基类为空,问题就会消失。这是编译器错误吗?我希望它不要管我的指针。