对《深入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值




你可能感兴趣的:(对《深入C++对象模型》中的一个疑问——虚函数表的type_info的位置)