当我将对象添加到向量时,为什么typeID名称会更改

Why does the typeid name changes when I add the object to a vector?

本文关键字:typeID 为什么 对象 添加 向量      更新时间:2023-10-16
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>

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

)。

仍然,这并不是一个大麻烦,因为如果您打算通过基类指针存储派生的类实例,并检查其动态类型,您几乎肯定会希望至少具有virtual Destructor(否则删除一个实例通过基类指针将在不确定的行为中产生)。