虚函数表
class BaseClass { public: BaseClass(); virtual ~BaseClass(); virtual void f1(); virtual void f2(); int v1; int v2; };
typedef void (*F)(); BaseClass * b = new BaseClass(); int * p = (int *)b; //获取vptr指针的值 int * vptr = (int *)p[0]; //调用vtbl中的函数 F f = (F)vptr[2]; f();
设置断点后查看指针b指向的内存中的内容
可以看到vptr被安插在了第一的位置,后面才是成员变量的初始化
vptr指向一个数组,数组中的成员为虚函数的地址,通过取出虚函数的地址值转为函数指针后,可以直接调用虚函数