如果我運行下面的代碼,我得到不同的地址打印。爲什麼?C++多繼承 - 編譯器修改我的指針
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) {}
};
此外,如果任一基類爲空,則問題消失。 這是一個編譯器錯誤?我想讓它獨自離開我的指針。
不使用多重繼承不會使這個問題消失;如果Base類沒有虛函數,並且您將它們引入Derived類中,則會發生相同的情況。更重要的是,這是未定義的行爲,這就是故事的結局...... – enobayram
好吧,我不想從聯盟中獲取Base2指針,所以問題出現在聯合構造函數中,因爲我正在初始化一個Base2指針,它被調整。如果我使用void *指針,那麼它會強制編譯器保留我給它的地址。 – Bob