c++虚函数表详解(二)

来源:互联网 发布:js怎么验证邮箱 编辑:程序博客网 时间:2024/05/29 02:57
#include <iostream>#include <tchar.h>using namespace std;class Human{public:virtual void Print(){cout << _T("Human::Print") << endl;} virtual void Walk(){cout << _T("Human::Walk") << endl;}};int _tmain(int argc, TCHAR argv[], TCHAR envp[]){typedef void(*Func)();Human Modi;int* pModi = (int*)(&Modi);int* AddrOfModiVTable = (int*)(*pModi);cout << _T("Modi的虚函数表所在内存的首地址:") << AddrOfModiVTable << endl;Func pFun = (Func)(*AddrOfModiVTable);pFun(); pFun = (Func)(*(++AddrOfModiVTable));pFun(); int nEnd = (int)*(++AddrOfModiVTable);cout << nEnd << endl; return 0;}

如何通过虚函数表访问到虚函数?
 
运行结果如下:
 
Func pFun = (Func)(*AddrOfModiVTable); 详细讲解:
*AddrOfModiVTable :取出Modi的虚函数表所在的内存的前四个字节的内容A。
(Func)(*AddrOfModiVTable) :将内容A的类型由int强制转换成void (*)()。
(Func)(*(AddrOfModiVTable++)) :取出Modi的虚函数表所在的内存的第五个字节到第八个字节所存储的内容B,将内容B的类型由int强制转换成void (*)()。
nEnd 的值为零,表明虚函数表中第三项的内容为NULL,作为虚函数表的结束标志。
	
				
		
原创粉丝点击