ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

获取对象名

2020-02-28 09:45:05  阅读:320  来源: 互联网

标签:info vtable 对象 获取 int CObject PodPoint RTTI


Howto:从C++对象指针得到类名
2012-04-29JAVA程序在运行的时候,有丰富的动态类型信息。而C++则困难的多。C++的运行时类型信息有3种实现方式:语言本身的RTTI、MFC的CObject、QT的moc。下面仅介绍前两种。一、语言本身的RTTI:如果是POD类型,如:clas…JAVA程序在运行的时候,有丰富的动态类型信息。而C++则困难的多。C++的运行时类型信息有3种实现方式:语言本身的RTTI、MFC的CObject、QT的moc。下面仅介绍前两种。一、语言本身的RTTI:如果是POD类型,如:class PodPoint{public:int x;int y;};那么它和C语言中的struct没有什么区别。sizeof(PodPoint)=8。偏移值 内容0 x4 y别妄想能从它的对象指针中得到什么类型信息。如果它有虚函数,那么就不一样了class PodPoint{public:int x;int y;virtual ~PodPoint(){};};在32位程序中,sizeof(PodPoint)=12。这是因为凡是有虚函数,就必须有vtable。所以PodPoint的实际布局就变成了这样:偏移值 内容0 指向vtable的指针4 x8 y如果编译的时候打开了RTTI(在vc2005及以上版本默认会打开),那么就很有意思了。在vtable[-1]的位置,是一个特殊的指针,指向RTTI Complete Object Locator,它的第12个字节开始,是一个指针,指向type_info对象。于是我就写了下面这样的代码:void printMyClassInfo(void p){type_info** vtable=(type_info***)((int)p);type_info** v1=vtable[-1];type_info* v=v1[3];printf("%s\n",v->name());}在有vtable的情况下,这个函数工作的非常好。二、MFC的RTTIMFC中的大多数对象都从CObject继承而来,例如:class MyPoint:public CObject{public:int x;int y;DECLARE_DYNAMIC(MyPoint)};IMPLEMENT_DYNAMIC(MyPoint,CObject)那么我们就可以通过调用CObject的virtual CRuntimeClass* GetRuntimeClass() const来得到类名。这个函数一般就在vtable的第一个。代码如下:void printClassInfo(void p){int vtable=(int*)p;CRuntimeClass* info;__asm{mov ecx,p;mov eax,vtable;call [eax];mov info,eax;}printf("%s",info->m_lpszClassName);};假如将上面的IMPLEMENT_DYNAMIC和DECLARE_DYNAMIC去掉,那么输出的结果将是”CObject”,而不是”MyPoint”,原因很简单。因为子类没有覆盖基类的这个方法嘛。作者 snnn

weixin_45376832 发布了1 篇原创文章 · 获赞 0 · 访问量 14 私信 关注

标签:info,vtable,对象,获取,int,CObject,PodPoint,RTTI
来源: https://blog.csdn.net/weixin_45376832/article/details/104550145

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有