怀疑Vptr-想知道它是如何获得Vtable地址的

时间:2010-05-21 10:57:01

标签: c++

我想知道vptr如何获得vtable基地址。

例如

class A
{
virtual getdata();
int a;
}

现在,

A obj; /// here vptr getting vtable's base address.

我想知道这个谜...... 提前致谢

4 个答案:

答案 0 :(得分:1)

vptr由编译器生成的代码初始化,作为obj初始化的一部分。这里没有魔法,它只是这样分配:

struct __A_vtbl_def {
    void (*getdata)(__A*);
};

__A_vtbl_def __A_vtbl = {
    &A__getdata
};

struct __A {
    __A_vtbl_def* vptr;
    int a;
};

__A obj;
obj.vptr = &__A_vtbl;

注意:这是所有伪装代码,显示编译器如何实现vptr。我不知道最近实际的代码编译器吐出了什么。

答案 1 :(得分:1)

这不是C ++问题,C ++中没有vtable或vptr,有些供应商使用vtables实现虚函数,但它完全依赖于实现。

答案 2 :(得分:1)

A的构造函数将自动初始化vtable-pointer以指向正确的vtable。这是我的编译器为您的特定示例生成的汇编代码片段(来自A::A):

004114A3  mov         eax,dword ptr [this] 
004114A6  mov         dword ptr [eax],offset A::`vftable' (415740h) 

正如您所看到的,编译器生成的代码将类A的vftable-pointer复制到实例的开头。

答案 3 :(得分:0)

编译器生成一个类的vtable,并且在编译时确定vtable的地址。因此,如果在运行时实例化一个对象,则vptr将获得Vtable的地址。