8

我无法正确获取 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

4

3 回答 3

20

问题是它A没有虚函数,所以不被视为多态类型。结果,typeid查找指针的声明类型,而不是它指向的对象的实际类型。

于 2013-08-09T13:36:36.483 回答
10

它指向的对象必须是多态的,才能按预期工作。如果Avirtual方法,那么您的代码将按预期工作,例如添加一个虚拟析构函数,我在这里使用 gcc 进行演示

引用C++ 草案标准部分5.2.8 类型标识2段说:

当 typeid 应用于类型为多态类类型 (10.3) 的 glvalue 表达式时,结果引用表示最派生对象类型的 std::type_info 对象 (1.8) [...]

这适用于我们有virtual方法的情况,在您的情况下,您没有多态类型,因此第3段适用:

当 typeid 应用于多态类类型的 glvalue 以外的表达式时,结果引用表示表达式静态类型的 std::type_info 对象

所以你会得到static返回的类型是A.

只是为了更完整一点10.3 虚函数说:

虚函数支持动态绑定和面向对象的编程。声明或继承虚函数的类称为多态类。

于 2013-08-09T15:00:52.530 回答
0

在修剪草坪时考虑过......指针无法知道它指向的对象类型。类型信息与指针一起存储,并且不会通过指向派生类 (B) 来更改。因此,您需要一个类型转换来更改指针的类型,并且按预期输出 IS。

于 2013-08-09T14:11:48.167 回答