请问VC++中RTTI是如何实现的?

SuperCpp 2007-11-13 09:57:14
我在看深度探索C++对象模型,里面说RTTI的信息是放在Vtbl中的一个slot中,这么理解的话如果没有vptr那么就无法实现RTTI,但在VC中测试,一个空类(sizeof == 1)也可以通过typeid输出name信息,请高手指导一下VC中是如何实现的!
...全文
237 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ypb362148418 2009-12-08
  • 打赏
  • 举报
回复
RTTI是两个宏形成的,你看看深入浅出MFC就清楚了,前面有作者实现的例子
冻结 2009-12-08
  • 打赏
  • 举报
回复
C++ 的RTTI和MFC的RTTI不同。
MFC的RTTI比c++的RTTI要早。

c++的RTTI是在虚函数的基础上改造得到的。
如果没有虚函数,就不会有RTTI。
yzm365487848 2009-12-08
  • 打赏
  • 举报
回复
好帖没人回答。。
lin_style 2007-11-13
  • 打赏
  • 举报
回复
一个大大的链表过程。。
独孤过儿 2007-11-13
  • 打赏
  • 举报
回复
再补充一句:

It is important to realize that RTTI is applicable solely to polymorphic objects. A class must have at least one virtual member

function in order to have RTTI support for its objects.
独孤过儿 2007-11-13
  • 打赏
  • 举报
回复
第一个里面都没有虚函数,怎么能RTTI呢?
SuperCpp 2007-11-13
  • 打赏
  • 举报
回复
是我弄错了,刚才测试了一下
class B
{

};

class D : public B
{

};

void main_InCOM()
{
B* pB = new D;
cout<<typeid(*pB).name()<<endl;
}
输出的结果是 class B

有了虚函数的情况就不一样了
class B
{
virtual void fun() {}
};

class D : public B
{

};

void main_InCOM()
{
B* pB = new D;
cout<<typeid(*pB).name()<<endl;
}

输出结果是 class D
Tiger_Zhao 2007-11-13
  • 打赏
  • 举报
回复
调用对象的方法的确需要通过Vtbl取得函数指针,但是Vtbl是全局存在的,与是否有对象创建无关,你描述的情况就是编译器在编译时直接访问了Vtbl,甚至可能预先执行了函数,将结果放在exe中直接进行输出。
vsfan 2007-11-13
  • 打赏
  • 举报
回复

lz你不是已经通过实验搞清楚了么?

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧