虚函数表

 

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指向一个数组,数组中的成员为虚函数的地址,通过取出虚函数的地址值转为函数指针后,可以直接调用虚函数

 


posted @ 2018-01-19 16:51  DoSomethingYouLike  阅读(170)  评论(0编辑  收藏  举报