在修復巨大代碼庫中的錯誤時,我觀察到一種奇怪的情況,其中動態類型的引用從原始Derived
類型更改爲Base
類型!我提供了最少的代碼來說明問題:在什麼情況/情況下,dynamic_cast <>可能會失敗?
funcptr
是一個函數指針(void (*)(SomeClass&)
)。 funcptr
可以指向如此多的功能,並且它們有自己的呼叫流程,因此很難調試。
很奇怪的是,在調用函數指針之後,派生類型ref
從Derived
更改爲Base
。爲了緩解我的工作,我懷疑對象從Derived
切片到Base
,所以我製作了~Base()
純virtual
並重新編譯了整個源代碼。但是沒有編譯器錯誤,這意味着沒有聲明Base
的對象。
潛在的原因是什麼,ref
Derived
的動態類型更改爲Base
,並且dynamic_cast
以後失敗?
如果typeid(ref)在調用之後是基礎的,那麼函數會與對象混淆。你傳遞一個指向對象的指針,所以在整個對象上寫入隨機的東西是很容易的。 – 2012-02-11 08:54:47
@LokiAstari,雖然這段代碼已經穩定好幾年了,但你告訴我的是主要的嫌疑人。 'pVoid'可能會搞亂它,但我必須看看它在什麼情況下發生。在此之前,我想檢查一下,如果我遺漏了任何可能會將動態類型更改爲靜態類型以供參考的小事。 – iammilind 2012-02-11 09:11:40