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
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!