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