运行时类型标识RTTI常见问题分析

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<>()能用来转换指针,不能确定该对象的精确类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值