曲径通幽

programming_with_fun();

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  18 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

常用链接

留言簿(6)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

  最近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 


posted on 2010-10-18 18:07 Meiosis 阅读(2083) 评论(1)  编辑 收藏 引用 所属分类: Windows GenericDebug \ Reverse EngineeringWork Experience

Feedback

# re: 利用C++对象模型通过父类调用子类特有的虚函数 2010-10-19 13:23 空明流转
不可取。  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理