Hi all, i wanted to know how vptr getting vtable base address.
for instance
class A
{
virtual getdata();
int a;
}
now,
A obj; /// here vptr getting vtable's base address.
i wanted to know this mystery.. Thanks in advance
Hi all, i wanted to know how vptr getting vtable base address.
for instance
class A
{
virtual getdata();
int a;
}
now,
A obj; /// here vptr getting vtable's base address.
i wanted to know this mystery.. Thanks in advance
The vptr is initialised by compiler-generated code as part of the initialisation of obj. There's no magic here, it just assigns it like so:
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;
Note: This is all pretend code showing how a compiler might implement the vptr. I have no idea what actual code compilers spit out these days.
This is no C++ question, there is no vtable or vptr in C++, some vendors implement virtual functions using vtables, but its completely implementation dependent.
The constructor of A will automatically initialize the vtable-pointer to point to the correct vtable. Here's a snippet of the assembly code generated by my compiler for your particular example (this is from A::A):
004114A3 mov eax,dword ptr [this]
004114A6 mov dword ptr [eax],offset A::`vftable' (415740h)
As you can see the compiler generates code that copies the vftable-pointer for class A to the beginning of the instance.