飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 1738|回复: 2

[C/C++] A对象调用B对象的方法再勾引全局函数

[复制链接]

该用户从未签到

发表于 2010-1-28 13:51:01 | 显示全部楼层 |阅读模式
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
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2010-1-28 13:53:34 | 显示全部楼层
写这个没啥意思 主要就是想说 其实内存里的东西 你说他是啥 他就是啥 其实也不是啥

什么对象方法的 类之乎者也的 都是内行忽悠外行的套话 了解内存模型后 随你任意蹂躏
PYG19周年生日快乐!

该用户从未签到

发表于 2010-1-28 21:40:35 | 显示全部楼层
:lol:
还是**的函数指针啊!~
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表