C++ 当我将对象添加到向量时,为什么typeid名称会更改? 包括 矢量控制台; Console*索尼=新索尼(); cout

C++ 当我将对象添加到向量时,为什么typeid名称会更改? 包括 矢量控制台; Console*索尼=新索尼(); cout,c++,typeid,typeinfo,C++,Typeid,Typeinfo,基类很可能没有virtual方法,因此不是多态的typeid仅为多态类提供动态类型,对于非多态类,您将只获得静态类型(这背后的实现细节是,通常有关动态类型的信息通过vptr提供) 尽管如此,这并不是一个大麻烦,因为如果您计划通过基类指针存储派生类的实例并检查它们的动态类型,您几乎肯定会希望至少有一个virtual析构函数(否则通过基类指针删除实例将导致未定义的行为) 如果您希望能够通过类型来区分实例,那么这个问题和答案可能会有进一步的帮助:可能您的基类是非多态的。确保它至少有一个虚拟函数我不敢相

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


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

如果您希望能够通过类型来区分实例,那么这个问题和答案可能会有进一步的帮助:可能您的基类是非多态的。确保它至少有一个虚拟函数我不敢相信我忘记了多态性,这就是你考虑改用它的问题?类似于:
if(dynamic_cast(consoles[i])!=nullptr)
.Wops,我刚刚注意到问题已经在注释中解决了。。。嗯,我希望这至少对未来的游客有用。
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;
    }
}