博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过函数指针使用虚函数表中的函数
阅读量:4210 次
发布时间:2019-05-26

本文共 1472 字,大约阅读时间需要 4 分钟。

虚函数是实现多态是通过维护一张虚函数表来实现的。

在类对象的头4个字节中,有一个指向这个虚函数表的指针,我们称为Vptr;


写一个类AA

class AA{public:    virtual void F1()   {       cout << "AA:f1" << endl;    }    virtual void F2()   {       cout << "AA:f2" << endl;    }    virtual void F3()   {       cout << "AA:f3" << endl;    }};

AA中有虚函数, 那么就有一张虚函数表;我们可以把AA 类对象的头4个字节拿出来,找到这张表

类对象: AA aa;

函数指针

typedef void(*FUN)();FUN pFun;

得到vptr的地址: (int*)&aa

得到虚表的地址:*(int*)&aa)

得到表中第一个函数地址: (int*)(*(int*)&aa)

取表中函数指针:(*(int*)(*(int*)&aa)) (对上面那个进行引用)

转成函数指针,供调用:

pFun = (FUN)(*(int*)(*(int*)&aa));    pFun();  //调用了AA的F1函数

这里写图片描述

当有类BB继承AA时,若BB中重写了AA的虚函数,那么就把虚表中的函数覆盖成自己的;

这里写图片描述
那么在调用时就会调用BB的F2函数;

完整测试代码:

class AA{public:    virtual void F1()    {        cout << "AA:f1" << endl;    }    virtual void F2()    {        cout << "AA:f2" << endl;    }    virtual void F3()    {        cout << "AA:f3" << endl;    }};class BB:public AA{public:    virtual void F2()    {        cout << "BB:f2" << endl;    }};int main(){    AA aa;    typedef void(*FUN)();    FUN pFun;    //F1    pFun = (FUN)(*(int*)(*(int*)&aa));    pFun();    //F2    pFun = (FUN)(*((int*)(*(int*)&aa)+1));    pFun();    //F3    pFun = (FUN)(*((int*)(*(int*)&aa) + 2));    pFun();    cout << "-----------------------------------" << endl;    //父类的指针指向子类的对象    AA * pA = new BB;    //F1    pFun = (FUN)(*(int*)(*(int*)pA));    pFun();    //F2    pFun = (FUN)(*((int*)(*(int*)pA) + 1));    pFun();    //F3    pFun = (FUN)(*((int*)(*(int*)pA) + 2));    pFun();    system("pause");    return 0;}
你可能感兴趣的文章
关于USB Gadget开发
查看>>
tofel词汇
查看>>
jellybean的suspend策略变动
查看>>
Android linux的休眠和唤醒
查看>>
高通msm8x60 boot(lk)的usb处理解析流程
查看>>
MSM8260 EHCI-MSM72k主控制器的状态机迁移分析
查看>>
MSM8x60 OTG之设备控制器流程分析
查看>>
MSM8X60 USB控制器流程分析
查看>>
sd卡驱动分析之card
查看>>
sd卡驱动分析之core
查看>>
sd卡驱动分析之host
查看>>
sd卡驱动分析之相关硬件操作和总结
查看>>
好的播文
查看>>
linux dd命令解析
查看>>
linux find命令详解
查看>>
S3C2440上touchscreen触摸屏驱动
查看>>
ARM-Linux驱动-触摸屏驱动分析
查看>>
GPIO的上拉电阻的作用
查看>>
kernel power off流程分析
查看>>
Qualcomm pmic充电流程分析(msm8660)
查看>>