最近QQ游戏开发群里有一位朋友出了一道题,“如何在基类中调用子类独有的函数,而不调用强制转换”。这道题我一时间没做出来,但是如果放宽限制,其实可以玩一个有趣的游戏。
如果题目改为“如何在基类中调用子类独有的虚函数,而不调用Class类型强制转换”,那就可以利用C++对象模型中的虚表的直接访问来实现父类调用子类的特有虚函数。(注意,这里特有是指子类有而基类没有。)
以下是我的解法,也在QQ群里发了,想不到引起群成员小小的轰动,看来游戏开发还是有很多同学对底层不感兴趣啊。
1 #include <stdio.h>
2
3 class CFather{
4 public:
5 virtual ~CFather(){}
6 };
7
8 class CSon : public CFather{
9 virtual ~CSon(){}
10
11 virtual void DoSomething(void){ printf("son is crying\n"); }
12 };
13
14 int _tmain(int argc, _TCHAR* argv[])
15 {
16 CFather* fa = new CSon();
17 DWORD dwDoSomething = (*(DWORD*)(*(DWORD*)fa+4));
18 _asm MOV ecx, fa
19 _asm CALL dwDoSomething
20
21 system("pause");
22 return 0;
23 }
24
25