1 #include <iostream>
2 #include <string>
3 using namespace std;
4
5 class Object{
6 public:
7 virtual void ToString(){
8 cout<<"Object"<<endl;
9 }
10 };
11
12 class Test : public Object{
13 private:
14 string name;
15 public:
16 string GetName(){
17 return name;
18 }
19 void SetName(string name){
20 this->name=name;
21 }
22
23 public:
24 void ToString(){
25 cout<<"Test"<<endl;
26 }
27
28 public:
29 static Object* Call(Object* obj){
30 Test* test = new Test();
31 return test;
32 }
33 };
34
35 class Test22 : public Object{
36 public:
37 void ToString(){
38 cout<<"Test22"<<endl;
39 }
40
41 public:
42 static Object* Call(Object* obj){
43 Test22* test = new Test22();
44 return test;
45 }
46 };
47
48
49
50 typedef Object* (*MethodPtr)(Object*);
51
52
53 class Method{
54 public:
55 string Name;
56 MethodPtr MethodPtr;
57 Object* Invoke(Object* arg){
58 Object* obj = MethodPtr(arg);
59 return obj;
60 }
61 };
62
63
64
65
66 class Type{
67 public:
68 MethodPtr MPtr;
69 Type(MethodPtr ptr){
70 MPtr=ptr;
71 }
72
73 public:
74 Method* GetCtor(){
75 Method* method=new Method();
76 method->Name=".ctor";
77 method->MethodPtr = MPtr;
78 return method;
79 }
80 };
81
82 //typedef Object (__stdcall Method::*CallPtr)(Object);
83
84
85 int main(){
86 cout<<"----------------"<<endl;
87
88 Type* type = new Type(&Test::Call);
89 Method* method = type->GetCtor();
90 Object* obj = method->Invoke(NULL);
91 obj->ToString();
92
93
94 Type* type2 = new Type(&Test22::Call);
95 Method* method2 = type2->GetCtor();
96 Object* obj2 = method2->Invoke(NULL);
97 obj2->ToString();
98
99
100 cout<<"----------------"<<endl;
101 cin.get();
102 }
1 ----------------
2 Test
3 Test22
4 ----------------