运行期类型信息
C++
虽然执行期类型信息是一个通用的电脑术语,但是通常用来称呼C++的特质。为了让C++的指令达到动态指派(dynamic_cast)、类型识别码(typeid)操作与例外处理的能力,执行期类型信息是必须的。
C++语言提供了dynamic_cast和typeid两种运算符,typeid用于在运行时识别类型信息,dynamic_cast具有运行时类型识别和类型转换匹配2个功能。实现方法为每个类型对应一个const type_info类型对象,存储了这个确切类型信息。在C++标准头文件中,type_info类重载了operator=()、operator!=()、name()等成员函数。
dynamic_cast的语法形如:
dest和src都必须为指针或者引用。如果运行时src和dest所引用的对象,是相同类型,或者存在is-a关系(public继承),则转换成功;否则转换失败。dynamic_cast只能用来转换多态类型(即定义了虚函数)的对象的指针或引用。如果操作数是指针,成功则返回目标类型的指针,失败返回NULL。如果操作数是引用,成功则返回目标类型的引用,失败抛出std::bad_cast异常。
dynamic_cast的“运行时类型的转换匹配”,是通过维护一棵由type_info类型对象作为节点的类型继承关系的树,遍历这棵继承树来确定一个待转换的对象的类型和目标类型之间是否存在is-a关系。
下列是一C++的执行期类型信息应用范例:
classbase{virtual~base(){}};classderived:publicbase{public:virtual~derived(){}intcompare(derived&ref);};intmy_comparison_method_for_generic_sort(base&ref1,base&ref2){derived&d=dynamic_cast(ref1);// rtti used here// rtti enables the process to throw a bad_cast exception// if the cast is not successfulreturnd.compare(dynamic_cast(ref2));}
参阅
面向对象程序设计
C++
免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。
- 有价值
- 一般般
- 没价值