我想知道vptr如何获得vtable基地址。
例如
class A
{
virtual getdata();
int a;
}
现在,
A obj; /// here vptr getting vtable's base address.
我想知道这个谜...... 提前致谢
答案 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的地址。