9

可能重复:
了解 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 处有 NULL 条目,或者换句话说,第一个条目的目的是什么?

PS 我认为这可能与对齐有关,但后来我添加了更多虚拟功能,但 RTTI 条目仍然在偏移量 8 处。

4

1 回答 1

8

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

请参阅以下相关的 stackoverflow 问题

从您的源代码中查看剩余的 -fdump-class-hierarchy ,大多数类似乎都有第一个条目作为(int (*)(...))0,唯一没有将它作为第一个条目的类将它作为第二个条目并将第一个条目作为给定流的 C++ STL 类层次结构的父类的偏移量。

在相关问题中,给出了一些 vtable 示例的死链接,我相信该链接的实时版本可在此处获得

另一个详细说明 vtables 结构的有用资源在这里

于 2012-10-27T13:40:49.137 回答