关于虚函数表的问题!
发布网友
发布时间:2022-05-01 04:31
我来回答
共2个回答
热心网友
时间:2022-06-24 11:14
因为b和a的对象数据前都一样有一个虚函数表的指针,这里就都是4个字节(32位),于是a对象还有一个int i,就成了8个字节了,b对象里除了继承来的i外,还有自己的j,都是int,当然是12了,
注意对象中都只是存放虚函数表的指针
热心网友
时间:2022-06-24 11:15
首先我们应当清楚:
为了得到正确的虚函数偏移量,C++编译器要将虚函数表的指针存在于对象实例中最前面的位置。
还有多层指针要从右往左一层一层拨剥开
问题一:当然不一样,首先p本身是一指针类型,是一种简单类型,*&p:先得到p在物理内存中的地址,再取出该地址中的数据,这个数据依然是指针类型,例如:p的物理地址是0x10,而0x10所在位置存的是0x20,那么输出就是0x20,而0x20依然是个地址。p:过程是相同的,只是写起来比较简单。
其次b是一对象类型,是非简单类型,插入符“<<”无法识别,除非你写一个重载该运算符的函数
&b是取出对象的地址,(int*)(&b)是将该地址转换为整形指针,就是对象虚表数组的首地址,*(int*)(&b)是将取出虚表数组的第一项,就是第一个虚函数的首地址,(int*)*(int*)(&b)就是将该地址转换为整形指针。
问题二:void*不是一个指向对象类型的指针(int*,long*都是),所以你向他取东西肯定是不行的,例如:void* p = NULL;
cout << *p << endl;
就不可以;
问题三:你这个之所以可以 是因为,你的函数碰巧没有参数,如果有的话,就不行了,编译器会说类似 从void()()转换成void()(char*)失败。
而Fun* 类型正好定义了参数序列。