最近QQ游戲開(kāi)發(fā)群里有一位朋友出了一道題,“如何在基類(lèi)中調(diào)用子類(lèi)獨(dú)有的函數(shù),而不調(diào)用強(qiáng)制轉(zhuǎn)換”。這道題我一時(shí)間沒(méi)做出來(lái),但是如果放寬限制,其實(shí)可以玩一個(gè)有趣的游戲。
如果題目改為“如何在基類(lèi)中調(diào)用子類(lèi)獨(dú)有的虛函數(shù),而不調(diào)用Class類(lèi)型強(qiáng)制轉(zhuǎn)換”,那就可以利用C++對(duì)象模型中的虛表的直接訪問(wèn)來(lái)實(shí)現(xiàn)父類(lèi)調(diào)用子類(lèi)的特有虛函數(shù)。(注意,這里特有是指子類(lèi)有而基類(lèi)沒(méi)有。)
以下是我的解法,也在QQ群里發(fā)了,想不到引起群成員小小的轟動(dòng),看來(lái)游戲開(kāi)發(fā)還是有很多同學(xué)對(duì)底層不感興趣啊。
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