[ 转载请注明来自CoderJeff的CSDN博客:http://blog.csdn.net/coderjeff/article/details/46544171,谢谢!]
在《深入C++对象模型》中,介绍vptr的指向时,第一个指向的是type_info,其次才是第一个虚函数的地址。但参考了下面这篇文章和其中的例子后,而且也经过自己的实验,发现不是那么回事,vptr指向的第一个位置其实是第一个虚函数的地址。
文章[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值 |