Q1:运行时类型识别(RTTI)简述
• 通过下面两个操作符实现RTTI:
1) typeid 操作符,返回指针或引用所指对象的实际类型
2) dynamic_cast操作符,将基类类型的指针或引用安全的转换为派生类型的指针或引用
对于带虚函数的类,在运行时执行RTTI操作符,对其他类型,在编译时计算RTTI操作符
Q2:dynamic_cast 操作符
• dynamic_cast操作符一次执行两个操作:验证,转换。只有验证被请求的转换有效后,才会进行类型转换
• 如果检测过程中发现转换无效,分为以下两种情况:
1) 若转换到指针类型失败,则 dynamic_cast 的结果是 0 值(值为 0 的指针转换结果也为0)
2) 若转换到引用失败,则抛出一个 bad_cast 类型的异常
• 推荐使用方法:
if (Derived * derivedPtr = dynamic_cast<Derived*>(basedPtr))
{
}
else
{
}
三个好处:
1) 在 if 内部才会执行派生内操作,在 else 中执行基类操作
2) 保证转换与结果测试在同一个表达式中进行
3) 在 if 外部不能访问该指针
Q3:typeid操作符
• typeid(e),此处的 e 是任意表达式或类型名
• 如果操作数不是类类型或是没有虚函数的类,则typeid操作符指出操作数的静态类型;若操作数是定义了一个以上的虚函数的类类型,在运行时计算类型
• 只有当操作数是含有虚函数的类类型对象的时候,才返回动态类型信息;若测试指针,返回的是指针静态编译时类型
○ if( typeid ( *bp) == typeid ( Derived )) //正确写法
○ if ( typeid (bp) == typeid ( Derived )) //错误写法,此时判断 Base* 与 Derived
• typeid 操作符提供以下几个操作:
1) t1 == t2;
2) t1 != t2;
3) t.name(); //返回C风格字符串,这是类型名字的可显示版本
4) t1.before(t2); //返回指出 t1 是否出现在 t2 之前的 bool值
本文介绍了运行时类型识别(RTTI)的概念及其在C++中的应用,包括typeid操作符的功能与用法,以及dynamic_cast操作符如何进行类型转换与验证。通过实例展示了正确的使用方法与注意事项。
2329

被折叠的 条评论
为什么被折叠?



