A对象调用B对象的方法再勾引全局函数
class Test{
public:
int m_ta;
public:
int DataDataDec(int a)
{
return m_ta - a;
}
int DataDataDec()
{
return m_ta;
}
};
class Func
{
public:
int m_fa;
int m_fb;
public:
Func(int a,int b):m_fa(a),m_fb(b){}
int GetDataSum()
{
return m_fa + m_fb;
}
int ff(int a,int b,int c){return 0;}
};
typedef int (Test::*FUNC_TEST)(int);
typedef int (Func::*FUNC_FUNC)(int);
typedef int (Func::*FUNC_FUNC3)(int,int,int);
typedef int (Func::*FUNC_FUNC0)(void);
void bfuncc()
{
printf("Hello!\r\n");
}
int __stdcall funcc(int a,int b,int c)// 这里是Debug模式下 使用__stdcall声明,让函数自动完成栈平衡
{
if (a>b)
{
return a+c;
}
printf("funck~\r\n");
return a-c;
}
int main(int argc, char* argv[])
{
FUNC_TEST p = Test::DataDataDec;
Func ObjC(10,20);
cout<< ((Test * )&ObjC)->DataDataDec(5) <<endl;
cout<< (ObjC.*(FUNC_FUNC)Test::DataDataDec)(3) << endl;
cout<< (&ObjC->*(FUNC_FUNC)p)(2) << endl;
// 有this指针,有明确的函数地址,就可以实现调用
// 至于数据将如何处理,调用者必须自己了解内存结构
void * pp = funcc;
FUNC_FUNC3 ppp; //= (FUNC_FUNC3)pp;
memcpy(&ppp,&pp,4);
(&ObjC->*(FUNC_FUNC3)ppp)(12,15,13); // 无参的平衡不了堆栈
// __asm add esp,0x0c;debug模式下会加入检测函数平衡机制 所以我们不能手动平衡
void * pp1 = bfuncc;
FUNC_FUNC0 ppp1;
memcpy(&ppp1,&pp1,4);
(&ObjC->*(FUNC_FUNC0)ppp1)();
return 0;
}
执行效果:
5
7
8
funck~
Hello!
Press any key to continue 写这个没啥意思 主要就是想说 其实内存里的东西 你说他是啥 他就是啥 其实也不是啥
什么对象方法的 类之乎者也的 都是内行忽悠外行的套话 了解内存模型后 随你任意蹂躏 :lol:
还是**的函数指针啊!~
页:
[1]