解析C++虚函数表

http://www.51cto.com/art/200712/62673.htm

 

里面给出的例子个人感觉不够好,应该用成员函数指针而不应该用函数指针。否则无法传递成员。。我给出的例子如下

 

  1. #include "stdafx.h"
  2. #include <iostream>
  3. using namespace std;
  4. class Base
  5. {
  6. private:
  7.     int i;
  8.     public:
  9.         Base():i(1)
  10.         {}
  11.         virtual void f()
  12.         {
  13.             cout << this->i << endl;
  14.         }
  15. };
  16. class De: public Base
  17. {
  18. private:
  19.     int j;
  20. public:
  21.     De():
  22.       j(10)
  23.     {
  24.     }
  25.     void f()
  26.     {
  27.         cout << this->j << endl;
  28.     }
  29. };
  30. int _tmain(int argc, _TCHAR* argv[])
  31. {
  32.     //char abc[200];
  33.     typedef void (Base::*FUNP)(void);
  34.     Base* pb = new De();
  35.     int* pvft = (int*)pb;//pvft is the point to virtual fun table;
  36.     FUNP* pf = (FUNP*)(*pvft); //pf is the content of the firt element in vft (it should be the function pointer)
  37.     FUNP ptoFunction = (FUNP)(*pf);  //the pf should be a point to the function. why add another *????
  38.     //FUNP ptoFunction = &Base::f;
  39.     (pb->*ptoFunction)();
  40.     int i;
  41.     cin >> i;
  42.     return 0;
  43. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值