先看下方的代码,我们所处的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. 认识多渲染目标(Multiple Render Targets)技术 【转】

    认识多渲染目标(Multiple Render Targets)技术 首先,渲染到纹理是D3D中的一项高级技术.一方面,它很简单,另一方面它很强大并能产生很多特殊效果. 比如说发光效果,环境映射,阴影 ...

  2. How to backup a remote PostgreSQL db and restore it locally?

    pg_dump and pg_restore 来备份和恢复数据库中的数据. 原文:  https://ksearch.wordpress.com/2012/09/28/how-to-backup-a- ...

  3. SQL查询刚開始学习的人指南读书笔记(一)关系数据库和SQL介绍

    PART I:Relational Databases and SQL Chapter2, Ensuring Your Database Structure IsSound. 数据库设计准则 什么是关 ...

  4. 自己亲自写的两本linux资料,免费下载,pdf文档

    第一本是我写的韩顺平老师解说的linux视频的笔记,该视频原本有21讲.可是我始终没有找到当中的17.18讲.可是其它部分我感觉及记录的还是蛮认真的.该套视频解说的非常基础,因此我的这本笔记也非常基础 ...

  5. java8 环境变量设置

    Java8环境变量配置:a.JAVA_HOME:jdk安装目录b.CLASSPATH:.;%JAVA_HOME%\libc.PATH:%JAVA_HOME%\bin配置环境变量方法:1.点击计算机,右 ...

  6. 微信小程序 解决 数字粗细不一 的bug

    1.bug 2.原因解析 微信小程序本身字体问题 3.解决方案 设置字体 font-family: Microsoft YaHei; .

  7. vue scoped 解决样式不生效问题

    对于添加样式不能影响子组件样式的情况使用:>>> <style scoped> .sti-inline{ display: inline; } .sti-searchfo ...

  8. 神秘值分解(Singular Value Decomposition)

    - 线性变化的几何表现 首先看下简单的矩阵,这是一个对角矩阵 M=(3001) 我们先用这个对角矩阵乘以一个点来看看它的几何变化. (3001)∗(xy)=(3xy) 在几何上就相当于把原来的向量x轴 ...

  9. 一个好用的短连接服务,mark备用

    http://to.ly/api.php? longurl=http://www.example.com 当中http://www.example.com 是你所须要转换的长链接地址.经过一个简单的g ...

  10. iOS学习笔记-自己动手写RESideMenu

    代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...