黑色二进制

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在外部凋用Class中的private函数

  在C++中,一般情况下Class中的private函数是不能在外部调用的,但通过下面这种特殊的方法可以突破这个限制。

 1 #include <iostream>
2
3 using namespace std;
4
5 void End();
6
7 class CTest
8 {
9 private:
10 void __stdcall foo (int A) { cout<<"A = "<<A<<endl; };
11 };
12
13 int main(int argc, char *argv[])
14 {
15 atexit(End);
16
17 //调用Class中的private函数
18 CTest obj;
19
20 unsigned long FooAddrPtr = 0;
21 __asm
22 {
23 //得到CTest::foo偏移地址
24 MOV EAX, OFFSET CTest::foo
25 MOV [FooAddrPtr], EAX
26 }
27
28 //方法一
29 void (__stdcall *FooPtr) (void* /*this*/, int /*A*/) = (void (__stdcall *) (void*, int)) FooAddrPtr;
30 FooPtr(&obj, 9);
31
32 //方法二
33 union
34 {
35 unsigned long FooAddr;
36 void (_stdcall *foo_ptr) (void *, int);
37 }T;
38
39 T.FooAddr = FooAddrPtr;
40 T.foo_ptr(&obj, 9);
41
42 return 0;
43 }
44
45 void End()
46 {
47 system("PAUSE");
48 }

  方法一是直接用函数指针转换,方法二是利用union中成员变量公用同一块内存从而进行强制转换。方法二还可用在很多需要类型强制转换的地方。

posted on 2011-07-28 21:56  黑色二进制  阅读(1077)  评论(2)    收藏  举报