我无法正确获取typeid功能。 我错过了什么
代码:
class A
{
public:
int a1;
A()
{
}
};
class B: public A
{
public:
int b1;
B()
{
}
};
int main()
{
B tempb;
A tempa;
A * ptempa;
ptempa = &tempb;
std::cout << typeid(tempb).name() << std::endl;
std::cout << typeid(tempa).name() << std::endl;
std::cout << typeid(*ptempa).name() << std::endl;
return 0;
}
它始终打印:
B级 A级 A类
我正在使用VS2010作为我的项目
答案 0 :(得分:20)
问题是A
没有虚函数,因此不被视为多态类型。因此,typeid
查找指针的声明类型,而不是它指向的对象的实际类型。
答案 1 :(得分:9)
它指向的对象必须是多态的,才能按预期工作。如果A
具有virtual
方法,那么您的代码将按预期工作,例如添加虚拟析构函数,我demo live here using gcc。
引用表单C++ draft standard部分5.2.8
类型标识段 2 说:
当typeid应用于类型为a的glvalue表达式时 多态类型(10.3),结果是指std :: type_info 表示最派生对象类型的对象(1.8)[...]
这适用于我们使用virtual
方法的情况,在您的情况下,您没有多态类型,因此段落 3 适用:
当typeid应用于除了glvalue之外的表达式 多态类型,结果是指std :: type_info对象 表示表达式的静态类型
因此,您将获得static
类型A
。
只是为了更完整的部分10.3
虚拟功能说:
虚函数支持动态绑定和面向对象 节目。声明或继承虚函数的类是 称为多态类。
答案 2 :(得分:0)
在修剪草坪时考虑过它......指针无法知道它指向的物体类型。类型信息与指针一起存储,并且不会通过指向派生类(B)来改变。所以你需要一个类型转换来改变指针的类型和输出IS的预期。