Typeid无法正常运行

时间:2013-08-09 13:32:55

标签: c++ typeid

我无法正确获取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作为我的项目

3 个答案:

答案 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的预期。