先看下方的代码,我们所处的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的应用的更多相关文章

  1. C 语言Struct 实现运行类型识别 RTTI

    通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型.c++通过下面两个操作符提供RTTI. (1)typeid:返回指针或引用所指对象的实际类型.    (2)dynamic_cast: ...

  2. RTTI: dynamic_cast typeid

    dynamic_cast:将基类类型的指针向派生类指针安全转换.多用于下行转换.上行转换时,和static_cast是一样的.C++类型转换看这里.而const_cast用来修改类型的const或vo ...

  3. Java系列笔记(2) - Java RTTI和反射机制

    目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...

  4. RTTI

    RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型.   编辑本段RTTI介绍 RTTI提 ...

  5. RTTI 运行时类型识别 及异常处理

    RTTI   运行时类型识别 typeid  ------  dynamic_cast dynamic_cast 注意事项: 1.只能应用于指针和引用之间的转化 2.要转换的类型中必须包含虚函数 3. ...

  6. 【Java基础】RTTI与反射之Java

    一.引言 很多时候我们的程序可能需要在运行时识别对象和类的信息,比如多态就是基于运行时环境进行动态判断实际引用的对象.在运行时识别对象和类的信息主要有两种方式:1.RTTI,具体是Class对象,它假 ...

  7. c++ typeid获取类型名-rtti

    typeid操作符的作用就是获取一个表达式的类型.返回结果是const type_info&.不同编译器实现的type_info class各不相同.但c++标准保证它会实现一个name()方 ...

  8. C++ 中dynamic_cast&lt;&gt;的使用方法小结 -判断类型-rtti

    将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理          即会作一定的判断.        对指针进行dynamic ...

  9. Java RTTI机制与反射机制

    1.1 什么是RTTI? 维基百科的定义:In computer programming, RTTI (Run-Time Type Information, or Run-Time Type Iden ...

  10. RTTI (Run-Time Type Identification,通过运行时类型识别) 转

    参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型.   RTTI提供了以下两个 ...

随机推荐

  1. gflops

    这个网站最棒了 http://kyokojap.myweb.hinet.net/gpu_gflops/

  2. ubuntu14.04 server 安装docker

    安装docker服务 $ curl -sSL https://get.docker.com/ | sh   $ ocker run hello-world 测试docker是否安装成功 ubuntu ...

  3. gensim加载word2vec训练结果(bin文件)并进行相似度实验

    # -*- coding: utf-8 -*- import gensim # 导入模型 model = gensim.models.KeyedVectors.load_word2vec_format ...

  4. IStorage

    IStorage 接口支持结构化存储对象的创建和管理. 结构化存储允许分层存储在单个文件的信息,和通常被称为“文件系统内文件”. 元素的结构化存储对象存储和小溪. 存储类似于目录,和流类似于文件. 在 ...

  5. 转:TensorFlow和Caffe、MXNet、Keras等其他深度学习框架的对比

    http://geek.csdn.net/news/detail/138968 Google近日发布了TensorFlow 1.0候选版,这第一个稳定版将是深度学习框架发展中的里程碑的一步.自Tens ...

  6. ELK学习笔记

    一.elk框架和java1.8环境搭建 1.1: 环境说明 约定: centos6 iptables关闭 如果不关闭的话,需要开放对应的端口访问 selinux关闭 1.2: ELK简介 els:El ...

  7. 【原】使用StarUML画用例图

    在写一份升级方案的时候,发现文字描述半天,好多句子,依然不容易被人看明白,使用visio画了个流程图,后来觉得画个时序图是最清晰得了. 于是在找了一个工具: startUML,当然,做时序图,建模之类 ...

  8. win8.1休眠状态下不能进入系统

    win8.1下进入睡眠状态出现的问题: 1.合上盖子或者是点击睡眠状态后唤醒进入锁屏界面.可是仅仅能鼠标移动,键盘全然输入不了,出现假死现象,仅仅能强制重新启动. 2.合上盖子再打开无法唤醒屏幕,必须 ...

  9. 【高德地图API】从零開始学高德JS API(二)地图控件与插件——測距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨

    不管是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装的一系列更加便于开发人员使用.降低开发人员工作量的二级API接口.除了官方通用的鱼骨.鹰眼控件,还有大量官方开发的地图插件,相似谷歌 ...

  10. iOS项目中的网络请求和上下拉刷新封装

    代码地址如下:http://www.demodashi.com/demo/11621.html 一.运行效果图 现在的项目中不可避免的要使用到网络请求,而且几乎所有软件都有上下拉刷新功能,所以我在此对 ...