代码中有一个单继承关系,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中实际运行的过程吗?
或者还有什么关于类类型方面的工具可以使用吗?