类函数成员地址的注意问题 [**]

由于类函数成员默认情况下为__thiscall调用约定, 故很多东西受到限制.

 

如在取得类函数成员地址的时候, 也不能轻易调用类函数成员, 这将导致函数参数被不正确地传递。

 

在C++中,成员函数的指针是个比较特殊的东西。对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用。但对

 

成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法。C++专门为成员指针准备了三个运算符: "::*"用于指针

 

的声明,而"->*"和".*"用来调用指针指向的函数

 

例:

 

 class tt
   {
       public: void foo(int x){ printf("/n %d /n",x); }
   };

   typedef   void  ( tt::* FUNCTYPE)(int );


    FUNCTYPE ptr = tt::foo;  //给一个成员函数指针赋值.

    tt a;
    (a.*ptr)(5);   //调用成员函数指针.

    tt *b = new tt; 

    (b->*ptr)(6); //调用成员函数指针. 

 

 

但在某些特殊情况下, 如拦截API. 函数的调用者并不是我们自己, 故可能无法做到此类调用.  对于此类情况, 

 

一.  拦截处理指向的新函数用非类成员函数

 

二. 拦截处理指向的新函数用类静态成员函数 ( 类静态成员函数在类对象未创建之初既已分配内存及地址, 故不受__thiscall约定限制 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值