对虚函数、虚表的认识

虚函数:实现多态的机制,多态就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。让父类的指针有“多种形态”,一种泛型技术。

关键字:virtual

虚函数表:此表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其内容真实反映实际的情况。

在C++标准规格说明书中说到,编译器需要保证虚函数表的指针在于对象实例中最前面的位置。(保证正确取到虚函数的偏移量)

如何访问虚表?

class Base
{
public:
    virtual void fun1()
    {
        cout << "Base:fun1()" << endl;
    }
    virtual void fun2()
    {
        cout << "Base:fun2()" << endl;
    }
    virtual void fun3()
    {
        cout << "Base:fun3()" << endl;
    }
private:
    int x;
};
typedef void (*pFun)();

void main()
{
    Base b;
    cout <<hex<< *(int*)(&b) << endl;  //获得虚表指针
    pFun fun = (pFun)*(((int*)*(int*)(&b))+1); //获得虚表中函数的地址
    fun();
}

访问续表成员

解释:根据前面知识,我们得到类实例所占空间的前四个字节空间为虚表地址。故__vfptr = *(int*)(&b)表示虚表的地址;然后在虚表的结构中,每个函数的地址也占用四个字节空间。

Base:a() =*(((int*)(*(int*)(&b)))+0);

posted @ 2019-07-11 20:44  Single_Dont  阅读(1452)  评论(0编辑  收藏  举报