2017-03-09 71 views
0
include <typeinfo>  

vector<Console*> consoles; 
Console* sony = new Sony(); 
cout << typeid(sony).name() << endl; // typeid name == 4Sony 
consoles.push_back(sony); 
cout << typeid(*consoles.back()).name() << endl; // typeid name == 7Console 
Console* microsoft = new Microsoft(); 
consoles.push_back(microsoft);//the same happens with microsoft consoles 

這基本上就是我想要做的事:當我將對象添加到矢量時,爲什麼typeid名稱會更改?

for(int i = 0; i < consoles.size(); i++){ 
    if(typeid(*consoles[i]).name() == typeid(Sony).name()){ 
     //cout << "it's a sony console" << endl; 
    } 
} 

我不能這樣做,因爲控制檯變化typeid的名字後,我將它添加到載體,所以是有辦法將控制檯的typeid名稱添加到向量後保持不變?

+0

如果你想要的是能夠通過類型區分實例,那麼這個問題和答案可以進一步幫助:http://stackoverflow.com/a/500495/1566187 – Elyasin

+1

可能你的基類是非多態的。確保它至少有一個虛函數 –

+0

我不能相信我忘了多態性,這是問題,謝謝 –

回答

0

最有可能的基類沒有virtual方法,因此不是多態。 typeid僅爲多態類提供動態類型,對於非多態類只提供靜態類型(此背後的實現細節通常是關於動態類型的信息是通過vptr引入的)。因爲如果你打算通過基類指針存儲派生類的實例並檢查它們的動態類型,你幾乎肯定會希望至少有一個析構函數(否則刪除它們)通過基類指針的實例會產生未定義的行爲)。

+0

呃,我剛剛注意到這個問題已經在評論中得到了解決......那麼,我希望這至少對未來的訪問者有用。 –

+0

沒問題,謝謝你的幫助 –

相關問題