2017-03-09 70 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

没问题,谢谢你的帮助 –

相关问题