首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Typeid不能正常工作

Typeid不能正常工作
EN

Stack Overflow用户
提问于 2013-08-09 13:32:55
回答 3查看 6.9K关注 0票数 8

我不能正确地得到类型函数。我是不是漏掉了什么

代码:

代码语言:javascript
复制
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类甲类甲类

我在我的项目中使用VS2010

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-09 15:00:52

它所指向的对象必须是多态的,才能像您预期的那样工作。如果A有比您预期的代码更多的virtual方法,例如添加一个虚拟析构函数(i 用gcc现场演示 )。

C++标准草案5.2.8类型识别第2段中的引文如下:

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

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

当type is应用于多态类类型的glvalue以外的表达式时,结果引用一个std::type_info对象,该对象表示表达式的静态类型。

因此,您将得到static类型,即A

为了更完整一些,10.3虚拟函数部分说:

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

票数 10
EN

Stack Overflow用户

发布于 2013-08-09 13:36:36

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

票数 20
EN

Stack Overflow用户

发布于 2013-08-09 14:11:48

在修剪草坪的时候想过了.指针无法知道它指向的对象的类型。类型信息与指针一起存储,这不会因为指向派生类(B)而改变。因此,您需要进行类型转换以更改指针的类型,并且输出结果与预期的相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18147864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档