2010-10-27
今天了解了一下C++的虚函数表,发现一个问题,那就是虚函数表的地址到底是什么???
指向虚函数表V-Table的指针一般是存放在类对象的内存空间中的前四个字节,那么取得这个指针值也就是可以取得对虚函数表的控制
参考一些代码,注视部分为自己所想
说说自己的理解:
&b 取对象地址,(int*)&b将取的地址转化为int* ,这个地址是指向对象内存空间的,所以它不是虚函数表的地址,对其解引用(int*)*(int*)&b之后,所得结果才是虚函数表的指针,也就是对象内存空间的前四个字节,那么我们通过这个指针要得到虚函数表中第一个虚函数的地址就可以在对其解引用一次(int*)*(int*)*(int*)(&b),如此,通过对虚函数表的指针的操作就可以得到所有的虚函数的地址
如取第二个虚函数:
((int*)*(int*)(&b)+1)将虚函数表指针移动一位,即指向第二个虚函数的地址,在解引用(int*)*((int*)*(int*)(&b)+1)得到第二个虚函数的地址,对其转换成fun的函数指针类型,在通过调用操作符(),就可以调用虚函数g()。