对《深入C++对象模型》中的一个疑问——虚函数表的type_info的位置

[ 转载请注明来自CoderJeff的CSDN博客:http://blog.csdn.net/coderjeff/article/details/46544171,谢谢!]


在《深入C++对象模型》中,介绍vptr的指向时,第一个指向的是type_info,其次才是第一个虚函数的地址。但参考了下面这篇文章和其中的例子后,而且也经过自己的实验,发现不是那么回事,vptr指向的第一个位置其实是第一个虚函数的地址。

C++ 虚函数表解析 [面试很常考]


文章[C++对象模型][10]类型转化提到的另一篇文章:对象与对象的类型信息----获取对象的RTTI信息

有下面几句代码:

Aclass* ptra=new Bclass;
 98    int ** ptrvf=(int**)(ptra);
 99    RTTICompleteObjectLocator str=
100        *((RTTICompleteObjectLocator*)(*((int*)ptrvf[0]-1)));

可以明显看到,虚表地址减1之后才得到类型信息。


结论:vptr指向的第一个位置是第一个虚函数的地址,不是type_info。


另外,文章typeid详解中提到:

ISO C++标准并没有确切定义type_info,它的确切定义编译器相关的,但是标准却规定了其实现必需提供如下四种操作(在之后的章节中我会来分析type_info类文件的源码):

 t1 == t2 如果两个对象t1和t2类型相同,则返回true;否则返回false
 t1 != t2 如果两个对象t1和t2类型不同,则返回true;否则返回false
 t.name() 返回类型的C-style字符串,类型名字用系统相关的方法产生
 t1.before(t2) 返回指出t1是否出现在t2之前的bool值



  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值