1、运行时类型标识(RTTI , Runtime Type Identification)提供了运行时确定对象类型及转换指针或者引用类型的方法。保证了面向对象语言中使用多态时能获得更合适的空间和效率。
2、typeid运算符可以获取与某个对象关联的运行类型信息。返回类型为type_infol类型。dynamic_cast运算符可以在运行时决定类型,如果成功将返回指针,不成功返回0。
3、基本的RTTI包括:
(1)、类识别:类名称或者ID
(2)、继承关系:支持运行时向下转换,即动态转换。
(3)、对象结构:函数的类型、名称及其位置。
(4)、成员函数:函数的类型、名称及其参数类型等。
(5)、能获得类所实例化的各个对象。
4、RTTI的应用:
(1)、异常处理:需要类名称等。
(2)、动态转换:在类中向下转换需呀累的继承RTTI。
(3)、多个文件集成:当某个程序对象调用其他程序对象时,使用其对象头文件后,将两种文件集成,但又无法重新编译,只能依赖RTTI。
(4)、对象I/O:C++将I/O对象与相关对象所属类名称RTTI内容完整的保存起来,读取对象时可根据RTTI内容实时分配内存空间。
5、动态类型转换downcast时存在5中隐藏的代价:
(1)、编码代价:类型安全的向下类型转换把复杂性从服务器代码移至用户代码。
(2)、维护代价:把服务器代码移到用户代码增加了总得软件大小。
(3)、测试代价:为了执行每一条测试语句包括向下类型转换的类型安全的if语句,必须设计一个测试装备。
(4)、运行时CPD的代价:必须执行附加的代码来测试向下类型转换的类型安全。
(5)、可扩充性代价:当增加新的派生类时,必须增加附加的控制流码。
6、static_cast<>()函数的使用说明:
(1)、static_cast<>()和dynamic_cast<>()都是模板函数。
(2)、static_cast<>()函数不能再无关的指针之间进行static类型强制,而reinterpret_cast<>()运算可用于两个毫不相关的两类型指针转换,不安全不可靠移植性差。
(3)、dynamic_cast<>()用于给指定基类对象指针转换为派生类指针,static_cast<>()运算符在进行这类操作时,不能保证转换后数据的有效性。
(4)、static_cast<>()用于派生类指针转换到基类指针,dynamic_cast<>()运算符在进行这类操作时,不能保证转换后数据的有效性。
7、typeid()和dynamic_case<>()函数区别:
(1)、dynamic_case<>()用来处理对象,typeid()可以处理对象和类型。
(2)、这两种函数都是在程序运行时才能获得类型信息。
(3)、typeid()不是模板函数。
(4)、这两种函数接受基类指针或者引用,该指针或者引用可以指向一个派生类对象。
(5)、typeid()返回类名函数;dynamic_case<>()用来传递类名函数。
(6)、使用typeid()能发现对象的精确类型,不能转换该指针;dynamic_case<>()能用来转换指针,不能确定该对象的精确类型。
运行时类型标识RTTI常见问题分析
最新推荐文章于 2022-08-03 22:54:33 发布