多重繼承下,派生類別指標轉基類別指標可能改變位址值(調整至對應基類別子物件起始位置)。
/* test.cpp
* Created on: 2014.04.21
* Author: Spike
*/
#include <iostream>
class A { int m_nA; };
class B { int m_nB; };
class C : public A, public B { int m_nC; };
int main() {
C* pc = new C;
B* pb = pc; // 隱式轉換,位址調整至 B 子物件
cout << "pc == pb : " << (pc == pb ? "equal" : "not equal") << endl;
cout << "int(pc) == int(pb) : " << (int(pc) == int(pb) ? "equal" : "not equal") << endl;
cout << "int(pc) == int((C*)pb) : " << (int(pc) == int((C*)pb) ? "equal" : "not equal") << endl;
return 0;
}
pc == pb : equal
int(pc) == int(pb) : not equal
int(pc) == int((C*)pb) : equal
pc == pb:指標比較會自動轉換為同型別再比較,語意相等。int(pc) != int(pb):實際位址不同,pb 指向 C 內的 B 子物件(偏移 sizeof(A))。int(pc) == int((C*)pb):將 pb 強轉回 C* 會還原偏移,位址相同。多重繼承下基類別子物件位址偏移是正常行為。避免直接比較指標整數值,應使用指標比較或 dynamic_cast 驗證關係。