Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1399136
  • 博文数量: 277
  • 博客积分: 2551
  • 博客等级: 少校
  • 技术积分: 3918
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-21 22:46
文章分类

全部博文(277)

文章存档

2017年(3)

2016年(9)

2015年(65)

2014年(27)

2013年(85)

2012年(61)

2011年(27)

分类: C/C++

2013-04-12 20:16:08

     c++中的多态的实现,主要通过虚函数表。
     虚函数表的位置就是this指针的位置,是一个数组的形式。
     可以不通过c++的标准方式调用成员函数,直接操作虚函数表的方式调用。
     当然这种非标准的调用方式,没有办法获得标准的方式的效果,主要是由于this指针没有办法传递
     可以从下面的代码可知
     #include
     using namespace std;
     class Test{
        public:
            Test(){ this->mem=1;}
        public:
            int mem;
        public:
            virtual void fun1(){cout<<"Test:fun1() member mem value:"<mem<             virtual void fun2(){cout<<"Test:fun2() member mem value:"<mem<             virtual void fun3(){cout<<"Test:fun3() member mem value:"<mem<       };
      typedef void (*Fun)(void);
      int main(){
          Test b;
           Fun pFun = NULL;
           cout<<"Vtable base addr:"<<(int*)(&b)<            //测试代码开始
           pFun = (Fun)*( (int*)*(int*)(&b));
           pFun();
           pFun = (Fun)*( (int*)*(int*)(&b)+1);
           pFun();
           //测试代码结束
           return 0;
       }    
       还有另外一种更加明晰的测试方式
          int ** pVtab = (int**)&b;

          int i = 0;
         for(;(Fun)pVtab[0][i] != NULL;i++)
         {
               pFun = (Fun)pVtab[0][i];
               cout<<"["<                pFun();

         }


          
          
                                     
       
阅读(1197) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

controlqsw2013-09-01 01:13:03

当时这个问题困惑了我很久,非常感谢赞哥的帮助