使用g ++版本4.6.3,64位计算机。我知道编译器可以随心所欲地实现虚函数。我想知道这里发生了什么。
我的课程:
#include <iostream>
class test
{
public:
virtual void func(){std::cout<<"in class test";}
};
int main()
{
test obj;
obj.func();
return 0;
}
查看编译器生成的虚拟表,
Vtable for test
test::_ZTV4test: 3u entries
0 (int (*)(...))0 (<---- what is this? )
8 (int (*)(...))(& _ZTI4test)
16 (int (*)(...))test::func
在偏移8处,它是RTTI
在偏移量16处,它是虚拟功能的输入。
我的问题是为什么在偏移0处有空的条目,或者换句话说第一次进入的目的是什么?
P.S。我认为这可能与对齐有关,但后来我添加了更多虚函数,但RTTI条目仍然是偏移8。
答案 0 :(得分:8)
我相信第一个条目或0的条目是顶部指针的偏移量。
请参阅the following relevant stackoverflow question
从源代码中查看余数-fdump-class-hierarchy,大多数类看起来第一个条目为(int (*)(...))0
,唯一没有它的类作为第一个条目拥有它作为第二个,并且在给定流的C ++ STL类层次结构的情况下将第一个条目作为父类的偏移量。
在相关问题中,给出了一些vtable示例的死链接,我相信该链接的实时版本可用here
详细介绍vtable结构的另一个有用资源是here。