虚拟表的说明

Explanation of virtual table

本文关键字:说明 虚拟      更新时间:2023-10-16

可能的重复:
了解VTable条目

使用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条目仍处于Offset 8。

我相信第一个条目或在0处的条目是顶指针的偏移。

请参阅以下相关的stackoverflow问题

从源代码中查看剩余的-fdump-class层次结构,大多数类似乎都有第一个条目为(int (*)(...))0,这是唯一没有它的类,因为第一个条目将其作为第二个条目,并具有首先输入作为对流的C STL类层次结构的偏移。

在相关的问题中,给出了一些与某些VTable示例的链接,我相信该链接的实时版本

可用

另一个有用的资源详细介绍了Vtables的结构。