C 多重繼承與void 指標轉換問題

2021-07-10 06:59:45 字數 813 閱讀 7546

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 中對指標進行型別轉換,不會改...