当我将对象添加到向量时,为什么typeID名称会更改
Why does the typeid name changes when I add the object to a vector?
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(否则删除一个实例通过基类指针将在不确定的行为中产生)。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 为什么使用 "this" 指针调用派生成员函数?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么比较运算符如此快速
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么不;名字在地图上是按顺序排列的吗
- 我的字符计数代码计算错误.为什么
- 为什么'typeid(x) == typeid(y)'的计算结果为 true,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id-表达式?
- 为什么typeID().名称(),c 在输出中未显示const
- 当我将对象添加到向量时,为什么typeID名称会更改
- 为什么使用"typeid"时必须输入数组的长度?
- 为什么typeid总是返回false
- 为什么函数上的typeid是可以的,而sizeof则不是
- 为什么 typeid 返回 int 和 const int 是相同的类型