c++支援多重繼承,然而多重繼承可能會導致一些奇怪的問題,我前段時間遇到乙個指標轉換問題,非常典型。
先看乙個簡單的測試**:
我測試了:#include using namespace std;
class ia
virtual void a() = 0;
};class ib
virtual void b() = 0;
};class cmulti : public ia, public ib
~cmulti(){}
void a()
void b()
};void testcasta(void *p)
void testcastb(void *p)
int _tmain(int argc, _tchar* argv)
(32位程式)執行的結果如下圖所示:
差異很明顯了,結論也很明了:多重繼承時,子類指標轉換為非第一繼承的父類指標時,會發生位址偏移(注意圖上標紅的部分)。這是因為每乙個父類都會占用 4 個位元組維護自己的虛函式表。所以,當 cmulti* 轉換為 ib* 時,指標加 4 ,因為 ia 是 cmulti 的第一父類, ib 是第二父類,依次類推……
如果我們在某些地方不得不使用 void* 來進行**適配時,遇到多重繼承就要注意這一點,否則很可能你呼叫的是 b() 方法,實際執行的是 a() ,達不到預期效果。
C 多重繼承下的指標型別轉換
在c 中,指標的型別轉換是經常發生的事情,比如將派生類指標轉換為基類指標,將基類指標轉換為派生類指標。指標的本質其實就是乙個整數,用以記錄程序虛擬記憶體空間中的位址編號,而指標的型別決定了編譯器對其指向的記憶體空間的解釋方式。基於上面的理解,我們似乎可以得出乙個結論,c 中對指標進行型別轉換,不會改...
C 多重繼承下的指標型別轉換
在c 中,指標的型別轉換是經常發生的事情,比如將派生類指標轉換為基類指標,將基類指標轉換為派生類指標。指標的本質其實就是乙個整數,用以記錄程序虛擬記憶體空間中的位址編號,而指標的型別決定了編譯器對其指向的記憶體空間的解釋方式。基於上面的理解,我們似乎可以得出乙個結論,c 中對指標進行型別轉換,不會改...
C 多重繼承下的指標型別轉換
在c 中,指標的型別轉換是經常發生的事情,比如將派生類指標轉換為基類指標,將基類指標轉換為派生類指標。指標的本質其實就是乙個整數,用以記錄程序虛擬記憶體空間中的位址編號,而指標的型別決定了編譯器對其指向的記憶體空間的解釋方式。基於上面的理解,我們似乎可以得出乙個結論,c 中對指標進行型別轉換,不會改...