为什么在将对象添加到向量时,typeid名称会更改?

时间:2017-03-09 19:53:55

标签: c++ typeid typeinfo

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

这基本上就是我要做的事情:

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名称在添加到向量后保持不变? / p>

1 个答案:

答案 0 :(得分:0)

很可能基类没有virtual方法,因此不是多态的。 typeid仅为多态类提供动态类型,对于非多态类,您只能获得静态类型(此后的实现细节通常是通过vptr获取有关动态类型的信息)。

但是,这不是一个大麻烦,因为如果你计划通过基类指针存储派生类的实例并检查它们的动态类型,你几乎肯定会想要至少有一个{{1}析构函数(否则通过基类指针删除实例将导致未定义的行为)。