VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 3774|回复: 2

【试一试】你对虚函数表的地址的理解有多深?

[复制链接]
 楼主| 发表于 2008-10-25 22:22:57 | 显示全部楼层 |阅读模式
  1. #include <iostream.h>

  2. class Base
  3. {
  4. public:
  5.     virtual void a()
  6.     {
  7.         cout<<"Base: a"<<endl;
  8.     }
  9.     virtual void b()
  10.     {
  11.         cout<<"Base: b"<<endl;
  12.     }
  13.     virtual void c()
  14.     {
  15.         cout<<"Base: c"<<endl;
  16.     }
  17.     virtual void d()
  18.     {
  19.         cout<<"Base: d"<<endl;
  20.     }
  21.     virtual void e()
  22.     {
  23.         cout<<"Base: e"<<endl;
  24.     }
  25.     virtual void f()
  26.     {
  27.         cout<<"Base: f"<<endl;
  28.     }
  29. };

  30. void main()
  31. {
  32.     Base b;
  33.     int i;
  34.     typedef void(*Fun)(void);

  35.     for (i=0; i<6; i++)
  36.     {
  37.         ((Fun)*((int*)*(int*)(&b)+i))();
  38.     }
  39. }
复制代码


如果能看懂这个程序,证明你的理解还可以。

[ 本帖最后由 VBProFan 于 2008-10-26 21:35 编辑 ]
 楼主| 发表于 2008-10-25 22:37:17 | 显示全部楼层
reker蓝色炫影(12088****) 21:44:44
  1.         Base b;
  2.         int *ptr;
  3.         typedef void(*Fun)(void);
  4.         ptr=(int*)(&b);
  5.         *ptr=*ptr-4; // 改成*ptr+=4;试试?
  6.         (
  7.                 (Fun)
  8.                 *(
  9.                         (int*)*(int*)(&b)+4
  10.                 )
  11.         )();
复制代码




reker蓝色炫影(12088****) 21:52:55
  1.         Base b;
  2.         int *ptr;
  3.         int *ptr2;
  4.         typedef void(*Fun)(void);
  5.         ptr=(int*)(&b);
  6.         *ptr+=4;//+4=下一个函数
  7.         ptr2=((int*)*ptr)+0;//+1=下一个函数
  8.         ((Fun)*(ptr2))();
复制代码


能看懂这两段程序的话就已经无敌了……

[ 本帖最后由 VBProFan 于 2008-10-26 22:02 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2008-11-12 21:15:53 | 显示全部楼层
C++入门书上有类似介绍
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2023-3-31 23:15

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表