class IntTT
{
public:
virtual void TV(){printf(__FUNCTION__"\n");};
};
typedef void (IntTT::*Func)();
union
{
long long addr;
Func f;
}ut;
void main()
{
ut.f = &IntTT::TV;
void* p2 = (void*)&((size_t&)(IntTT::TV));
Func p3 = &IntTT::TV;
void* p4 = (void*)((size_t&)p3);
}
成员函数指针与普通指针的区别
int i1 = 1, i2 = 2;
int& ir = i1;
int* ip = &i2;
void* vp = (void*)((size_t&)(ip));
00DF3CC4 mov eax,dword ptr [ip]
00DF3CC7 mov dword ptr [vp],eax
void* vp1 = (void*)((size_t&)(i1));
00DF3CCA mov eax,dword ptr [i1]
00DF3CCD mov dword ptr [vp1],eax
void* p1 = (void*)(((size_t&)(IntTT::TV)));
00DF3D36 mov eax,offset IntTT::`vcall'{4}' (0DF121Ch)
00DF3D3B mov ecx,dword ptr [eax] // 进行地址取内容操作,其他的指针强转直接赋值了
00DF3D3D mov dword ptr [p1],ecx
void* p2 = (void*)(&((size_t&)(IntTT::TV)));
00DF3D43 mov dword ptr [p2],offset IntTT::`vcall'{4}' (0DF121Ch)