2011-01-19 78 views
0

我試圖從接口向下傾倒派生類,但我的虛擬殺手它?虛擬接口Dtor && Dynamic_Cast

class IFOO 
{ 
public: 
virtual ~IFOO(){}; 

virtual size_t index() PURE; 
}; 

class FOO : public IFOO 
{ 
public: 
FOO() : size(5){}; 
~FOO(){}; 

virtual size_t index(){ return index; }; 

size_t index; 

}; 


int main() { 

IFOO* A = &FOO(); 

FOO* B = dynamic_cast< FOO* >(A); 

return 0; 
} 

這是爲什麼?

+3

請描述預期的行爲和你所得到的行爲。 – 2011-01-19 22:17:58

+0

我啓用了RTTI,因此我期望執行運行時檢查並對派生類進行強制轉換。我一直得到一個NULL指針,除非我從我的界面中刪除虛擬Dtor。 – 2011-01-19 22:21:44

回答

4

你正在一個臨時的地址線

IFOO* A = &FOO(); 

應該

IFOO* A = new FOO(); 

我想如果你從你的接口刪除析構函數,因爲在這種情況下,代碼工作它不會被調用,並且你進入了未定義行爲的領域,其中任何事情都是可能的,即使糟糕的代碼按預期工作。另外,我建議你不要在所有大寫中寫下你的類名,因爲這通常是宏的約定(除非你的類名是宏,但肯定不能)。此外,請勿使用宏(PURE)來製作純虛擬函數,這令95%的可能需要讀取代碼的人感到困惑。