我想知道vptr如何获取vtable基地址。
例如
class A
{
virtual getdata();
int a;
}
现在,
A obj; /// here vptr getting vtable's base address.
我想知道这个谜题的答案...提前感谢。
我想知道vptr如何获取vtable基地址。
例如
class A
{
virtual getdata();
int a;
}
现在,
A obj; /// here vptr getting vtable's base address.
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;
A
的构造函数将自动初始化 vtable 指针,使其指向正确的 vtable。以下是我的编译器为您的特定示例生成的汇编代码片段(来自 A::A
):
004114A3 mov eax,dword ptr [this]
004114A6 mov dword ptr [eax],offset A::`vftable' (415740h)
正如你所见,编译器生成的代码将类A
的虚函数表指针复制到实例的开头。
这不是关于C++的问题,C++中没有vtable或vptr,一些供应商使用vtable实现虚函数,但这完全取决于实现。
vtable
的"vtable
"或类似的东西。 - Andreas Brinck