qq_25422497 2015-12-28 11:06 采纳率: 50%
浏览 1369
已采纳

他们说这是关于虚函数的,可是我看不懂,求解。

图片

  • 写回答

6条回答 默认 最新

  • 关注

    c++知识点:这个类A 是一个含有虚函数的类,那么此时运行时编译器会为他生成虚表,并且在A类的对象内存的起始位置加了虚表的首地址,所以此时对象的大小会比
    不含有虚函数的类对象多了4个字节(32位机下),因为编译器需要通过这个指针去运行时寻找虚表。
    然后看看你的代码:
    在你的a对象的前四个字节存的是虚表的首地址(32位机,64位为8字节), 此事声明了一个函数指针类型,fp, 然后定义一个此类型的变量myfunc
    然后myfunc = (*((int*)*((int*)&a))); 这一行代码是最核心的,也是最难理解的。下面我用文字叙述“=”右边的表达式: 由内到外先对a对象取地址运算
    然后转成int*类型,再取*运算,这一步就得到了a的前四个字节,也就是以上说的虚表的首地址。最后在转再取*运算主要是将myfunc关联到test函数入口
    地址上面。这样的话你调用myfunc();就找到了虚表里面的test函数。达到间接调用的目的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 计算二重积分∫∫e^(x+y)dxdy,其中0≤x≤1,0≤y≤1,试分别用复合辛普森公式(取n=4)以及高斯求积公式(取n=4)计算积分 给出matlab程序
  • ¥15 opencv 无法读取视频
  • ¥15 用matlab 实现通信仿真
  • ¥15 按键修改电子时钟,C51单片机
  • ¥60 Java中实现如何实现张量类,并用于图像处理(不运用其他科学计算库和图像处理库))
  • ¥20 5037端口被adb自己占了
  • ¥15 python:excel数据写入多个对应word文档
  • ¥60 全一数分解素因子和素数循环节位数
  • ¥15 ffmpeg如何安装到虚拟环境
  • ¥188 寻找能做王者评分提取的