对虚函数、虚表的认识

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

关键字: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);

原文链接: https://www.cnblogs.com/single-dont/p/11172595.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    对虚函数、虚表的认识

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/298649

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月15日 下午8:00
下一篇 2023年2月15日 下午8:01

相关推荐