
6条回答 默认 最新
ปรัชญา แค้วคำมูล 2015-12-29 03:33关注c++知识点:这个类A 是一个含有虚函数的类,那么此时运行时编译器会为他生成虚表,并且在A类的对象内存的起始位置加了虚表的首地址,所以此时对象的大小会比
不含有虚函数的类对象多了4个字节(32位机下),因为编译器需要通过这个指针去运行时寻找虚表。
然后看看你的代码:
在你的a对象的前四个字节存的是虚表的首地址(32位机,64位为8字节), 此事声明了一个函数指针类型,fp, 然后定义一个此类型的变量myfunc
然后myfunc = (*((int*)*((int*)&a))); 这一行代码是最核心的,也是最难理解的。下面我用文字叙述“=”右边的表达式: 由内到外先对a对象取地址运算
然后转成int*类型,再取*运算,这一步就得到了a的前四个字节,也就是以上说的虚表的首地址。最后在转再取*运算主要是将myfunc关联到test函数入口
地址上面。这样的话你调用myfunc();就找到了虚表里面的test函数。达到间接调用的目的。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决评论 打赏 举报无用 2