xiaoxiangyue_lib 2018-03-20 03:31 采纳率: 0%
浏览 1036
已结题

dynamic_cast 不正常的失败,RTTI输出奇怪

代码中有一个单继承关系,derive->class1->class2->ObjectBase. 其中class2 public virtual 继承于base, 其余的继承关系都是public。
在一个模板函数传入derive的类型,并且有一个ObjectBase的指针ob指向derive的实例。在进行dynamic cast时返回了空
在代码中添加了RTTI,看打印。结果有些奇怪:

        const std::type_info& type = typeid(T);//得到derive的typeinfo
        const char* typeName = type.name();
        size_t typeHash = type.hash_code();
        printf("typeName:%s. typeHash:%zu.\n", typeName,typeHash);
        const std::type_info& object = typeid(*ob);//得到实例的typeinfo
        const char* objectTypeName = object.name();
        size_t objectTypeHash = object.hash_code();
        printf("objectTypeName:%s. objectTypeHash:%zu.\n", objectTypeName,objectTypeHash);
        bool equal = (type == object);
        printf("ob type is equal to T:%d.\n",equal);
    bool is_base = std::is_base_of<ObjectBase, T>::value;
    printf("ObjectBase To T:%d.\n", is_base);
    p = dynamic_cast <T *> (ob);

前两个printf打印出类型和实例的类名称和hash值。发现name是一样的,但是hash值不同。
按照我的理解name相同应该就是同一个类型,但hash值为什么不同呢?这代表是不同的类型吗?
第三个printf是使用typeinfo的比较运算符,发现返回的false。
但第四个printf是使用type traits中的is base of模板来检查T与ObjectBase之间的继承关系,输出是true。

我对RTTI其中比较运算符以及name/hash的实现原理不太清楚,这些输出似乎有些矛盾。
这是哪里出了问题呢?最终dynamic cast的失败的原因是什么呢?ob中指向的确实是derive的实例
c++中有什么办法看到dynamic cast中实际运行的过程吗?
或者还有什么关于类类型方面的工具可以使用吗?

  • 写回答

2条回答 默认 最新

  • xiaoxiangyue_lib 2018-03-20 03:39
    关注

    补充一下,这段代码是在一个动态链接库中的,通过载入来运行的。这个问题和库的载入有什么关系吗?实例的创建和类型的声明都是在库中自己做的

    评论

报告相同问题?

悬赏问题

  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用