2011-12-13 224 views
0

此代碼是否合法?傳遞對象指針作爲指向基類的指針

它崩潰了,我不確定是因爲我的編程環境(它是嵌入式設備),還是因爲我編寫了不友好的代碼。

int foo(NGKGame * game) { 
    game->init(); //Crashes here 
    return 0; 
} 

int main() { 
    NGKGame * game = new PlaneGame(); 
    game->init(); //This call is okay 
    foo(game); 

    return 0; 
} 

NGKGame是基類。 PlaneGame是從NGKGame派生的類。 init()是基類中的純虛函數,但在PlaneGame中實現。

感謝,

編輯:

被調用兩次初始化函數僅僅是作爲示例。在我目前的實施中,它是空的。

+0

你能否在兩種情況下檢查'game'和'init'的地址?他們是一樣的嗎? – fogbit

回答

0

沒有什麼不對您的片段。

雖然你是打算撥打NGKGame::init兩次,或者它只是你的示例代碼的一部分?我的直覺是PlaneGame::init裏面的東西在再次調用時出現故障,如果是這樣的話。

+0

這只是示例代碼的一部分。 – tangrs

1

此代碼很好 - 假設您可以撥打init()兩次。

init()是PV NGKGame不是問題。 PVs的全部重點是允許你以foo()的方式給他們打電話。

2

它可能會崩潰,因爲您在同一個對象上調用init()兩次。既然你沒有向我們展示init()的源代碼,我不能推測它爲什麼會崩潰,但它似乎應該只調用一次名爲init的函數。

如果你想有一個更好的答案,請參閱http://sscce.org/

0

該代碼看起來不錯。它可能必須與一些編譯器標誌。前段時間我有一個類似的問題。一個圍繞着指針的代碼,在沒有優化標誌(使用gcc)的情況下可以正常工作,但是會打開-O3(優化)。我沒有弄清楚如何擺脫這一點,所以我只是手動添加了各種優化標誌,這些標誌已經啓用了-O3並且工作正常。

相關問題