C++ RTTI的应用
先看下方的代码,我们所处的context在<<< void* pX = (void*)pGiven; >>>处,只知道上面这些类的信息和pX指针,怎么判断pX指向对象的类型?
- #include <stdio.h>
- #include <typeinfo>
- class CBase
- {
- public:
- virtual void message()
- {
- printf("hello , this is base\n");
- }
- };
- class CContainerA : public CBase
- {
- public:
- virtual void message()
- {
- printf("hello , this is A\n");
- }
- };
- class CContainerB : public CBase
- {
- public:
- virtual void message()
- {
- printf("hello , this is B\n");
- }
- };
- class CContainerC
- {
- public:
- virtual void message()
- {
- printf("hello , this is %s\n",typeid(*this).name());
- }
- };
- int main(int argc,char* argv[])
- {
- CContainerA* pGiven = new CContainerA();
- void* pX = (void*)pGiven;
- //pX maybe is a CContainerA* , or a CContainerB* , or a CContainerC*
- //how to judge it ?
- CBase* pUnknown = (CBase*)pX;
- CContainerA* pMaybeA = dynamic_cast<CContainerA*>(pUnknown);
- CContainerB* pMaybeB = dynamic_cast<CContainerB*>(pUnknown);
- CContainerC* pMaybeC = dynamic_cast<CContainerC*>(pUnknown);
- if(pMaybeA) pMaybeA->message();
- if(pMaybeB) pMaybeB->message();
- if(pMaybeC) pMaybeC->message();
- return ;
- }
CContainerA,CContainerB有共同的基类,可以通过强制转换pX到pUnknown,然后dynamic_cast确定是CContainerA还是CContainerB,CContianerC则无法判断。
当然如果是特定编译器,则仍然可判断出pX的对象类型,参照:
http://www.openrce.org/articles/full_view/23
http://www.cnblogs.com/zhyg6516/archive/2011/03/07/1971898.html
类的RTTI信息地址保存在虚函数表的-1项。
ADD:
RTTI要求编译器的支持,微软的一些系统dll中没有启用RTTI(vc++ configure : c/c++ - language - enable runtime typeinfo = false),所以会产生下列情况:
- void* lpOwner = GetDevice();
- IUnknown* pUnknown = (IUnknown*)(lpOwner);
- IDirect3DDevice9* pDevice = dynamic_cast<IDirect3DDevice9*>(pUnknown);
- IDirect3DSwapChain9* pSwapChain = dynamic_cast<IDirect3DSwapChain9*>(pUnknown);
- //Result : pDevice == NULL && pSwapChain == NULL
但是微软有更好的办法:
- IUnknown* pUnknown = (IUnknown*)(lpOwner);
- IDirect3DDevice9* pDevice = NULL;
- pUnknown->QueryInterface(IID_IDirect3DDevice9,(void**)&pDevice);
- IDirect3DSwapChain9* pSwapChain = NULL;
- pUnknown->QueryInterface(IID_IDirect3DSwapChain9,(void**)&pSwapChain);
- assert(!(pDevice && pSwapChain));
com接口自带RTTI !
C++ RTTI的应用的更多相关文章
- C 语言Struct 实现运行类型识别 RTTI
通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型.c++通过下面两个操作符提供RTTI. (1)typeid:返回指针或引用所指对象的实际类型. (2)dynamic_cast: ...
- RTTI: dynamic_cast typeid
dynamic_cast:将基类类型的指针向派生类指针安全转换.多用于下行转换.上行转换时,和static_cast是一样的.C++类型转换看这里.而const_cast用来修改类型的const或vo ...
- Java系列笔记(2) - Java RTTI和反射机制
目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...
- RTTI
RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. 编辑本段RTTI介绍 RTTI提 ...
- RTTI 运行时类型识别 及异常处理
RTTI 运行时类型识别 typeid ------ dynamic_cast dynamic_cast 注意事项: 1.只能应用于指针和引用之间的转化 2.要转换的类型中必须包含虚函数 3. ...
- 【Java基础】RTTI与反射之Java
一.引言 很多时候我们的程序可能需要在运行时识别对象和类的信息,比如多态就是基于运行时环境进行动态判断实际引用的对象.在运行时识别对象和类的信息主要有两种方式:1.RTTI,具体是Class对象,它假 ...
- c++ typeid获取类型名-rtti
typeid操作符的作用就是获取一个表达式的类型.返回结果是const type_info&.不同编译器实现的type_info class各不相同.但c++标准保证它会实现一个name()方 ...
- C++ 中dynamic_cast<>的使用方法小结 -判断类型-rtti
将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理 即会作一定的判断. 对指针进行dynamic ...
- Java RTTI机制与反射机制
1.1 什么是RTTI? 维基百科的定义:In computer programming, RTTI (Run-Time Type Information, or Run-Time Type Iden ...
- RTTI (Run-Time Type Identification,通过运行时类型识别) 转
参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个 ...
随机推荐
- Modify Headers模拟不同地域进行网页测试
今天要简单讲一下Modify Headers这个Firefox插件,记录一下我是怎么使用它的. Modify Headers: https://addons.mozilla.org/zh-CN/fir ...
- 一、ELKStack介绍与入门实践
第1章 ELKStack 对于日志来说,最常见的需求就是收集.存储.查询.展示,开源社区正好有相对应的开源项目:logstash(收集).elasticsearch(存储+搜索).kibana(展示) ...
- Vue组件进阶知识总结
上一篇我们重点介绍了组件的创建.注册和使用,熟练这几个步骤将有助于深入组件的开发.另外,在子组件中定义props,可以让父组件的数据传递下来,这就好比子组件告诉父组件:“嘿,老哥,我开通了一个驿站,你 ...
- 用尽洪荒之力整理的Mysql数据库32条军规(转)
今天上午吐血整理了Oracle SQL性能优化的40条军规,其中很多规则也是适用于Mysql的,结果今晚发现这一篇文章——用尽洪荒之力整理的Mysql数据库32条军规,和我的竟有异曲同工之妙,当然不同 ...
- IOS安装CocoaPods完整流程
作为一个底层系统大菜鸟,又搞过几年ios来说,安装一个CocoaPods是一件蛋痛的事~ 说懂又懂,说不懂又不懂. 由于安装过程比較复杂,步骤较多,而网上教程又比較零散,并且有一些是扯蛋的,所 ...
- Python3 range()函数
Python3 range() 函数用法 Python3 内置函数 Python3 range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表. Pyth ...
- 联想电脑Win8升级win10后Wlan关闭无法开启解决办法
官网下载电源驱动,下载无线网上驱动 开启电脑 按fn+f5 电源管理界面就出来了 把无线网卡打开 就ok了 这样就开启了无线! 如果还不行,可进行如下尝试,希望有所帮助: 1.开机进bios(一般是按 ...
- rxjs来啦
var text = document.querySelector('#text'); var inputStream = Rx.Observable.fromEvent(text, 'keyup') ...
- 159. Find Minimum in Rotated Sorted Array 【medium】
159. Find Minimum in Rotated Sorted Array [medium] Suppose a sorted array is rotated at some pivot u ...
- C++避免内存泄漏的一种技巧
C++ Primer 4th中在section 13.5中的U_Ptr就是一种实用的例子 通过计数的方式,并提供自己的抽象类型的Pointer,从而实现内存管理.在一定的范围内还是非常有效的,比如说在 ...