typeid及RTTI
来源:互联网 发布:烈焰遮天全套完整源码 编辑:程序博客网 时间:2024/09/21 06:33
C++中类型识别符typeid分静态识别和动态识别。
静态识别是指在编译阶段进行的识别,动态识别是指在运行阶段进行的识别。
只有动态识别需要RTTI的支持,但是RTTI是否打开不影响编译链接,只影响运行结果是否正确。
typeid的工作原理:
1. typeid是依赖于保存在虚函数表里面的type_info块来获取真实对象信息的。而如果基类没有任何虚函数的话,typeid就没法在运行期获得动态的对象类型信息。取而代之的是,typeid会将exp作为静态类型的表达式对待。
2. 如果把RTTI(运行时类型识别)关掉,那么虽然类的多态能力还具有,虚函数表也会在需要的时候现身,但是虚函数表就不会携带一块type_info信息了,从而使得typeid同样无法在运行期获得动态对象类型信息.
即,对于typeid(exp)而言:
1. 当RTTI能力被编译环境关掉时,那么typeid(exp)总是在编译期决定exp的类型,即静态类型。
2. 当RTTI能力开启时,分两种情况:
1) 如果exp的类型是内建类型或者不包含任何虚函数(无论是自己包含还是从基类继承而来)的class,那么typeid(exp)将返回exp的编译期静态类型。
2) 如果exp是含有虚函数的class,那么typeid(exp)将返回从type_info获取的动态对象类型信息。
RTTI的影响:
如果关闭了RTTI,编译器不会向类的虚函数表(如果有的话)增加type_info信息,而dynamic_cast及typeid都依赖于type_info才能正常工作。
1) dynamic_cast的运行结果:如果基类中无虚函数表,则编译失败;如果基类的虚函数的话,编译链接成功,但dynamic_cast实际只相当于C语言的中强制类型转换,不会做任何有意义的探测工作,即转换总是成功的――不会返回NULL或者抛出异常,这明显是违反逻辑的。
typeid操作符在没有type_info的支持下,只能做编译期的静态判别:永远返回操作符对象定义类型(往往是基类),而不会返回实际的派生类。- typeid及RTTI
- C++ RTTI(typeid)
- RTTI与typeid
- RTTI(dynamic_cast与typeid)
- RTTI, dynamic_cast, typeid
- RTTI(typeid、dynamic_cast)
- C++ Internals: VC RTTI - typeid
- C++ Internals: VC RTTI - typeid
- RTTI 之 typeid 的使用
- C++中的RTTI 与typeid
- c++ 38 RTTI ,dynamic_cast ,typeid
- RTTI中dynamic_cast和typeid
- C++ RTTI特性:typeid/dynamic_cast及常用四种类型转换运算符
- 关于typeid —— typeid和RTTI C++
- 关于typeid —— typeid和RTTI C++
- 关于typeid —— typeid和RTTI C++
- 通用C++ typeid实现(不支持RTTI)
- rtti的typeid与danamic_cast用法
- 关于九宫格
- 用Apache htpasswd管理SVN帐户
- curl_getinfo的巧用
- SQL查询入门(下篇)
- 《C关键字分析》之sizeof,enum、union和struct
- typeid及RTTI
- 社团发现算法研究和在SNS网络中的应用
- webx3.x之多语言支持扩展
- hibernate list和iterate 的区别 get和load的区别
- Android 实现View的渐隐渐现功能
- .net中using指令用法
- 【math】梯度(gradient)、雅克比矩阵(Jacobian)、海森矩阵(Hessian)
- C51浮点数显示、浮点数表示方法
- 解决mysql Access denied for user 'root'@'localhost'