Chinaunix首页 | 论坛 | 博客
  • 博客访问: 809
  • 博文数量: 1
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-02 21:03
文章分类

全部博文(1)

文章存档

2013年(1)

我的朋友
最近访客

分类: C/C++

2013-07-25 15:14:57

C++ 虚函数表解析
http://blog.csdn.net/haoel/article/details/1948051 


C++ 虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。

 

这里我们着重看一下这张虚函数表。C++的编译器应该是保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证取到虚函数表的有最高的性能——如果有多层继承或是多重继承的情况下)。 这意味着我们通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数。

下面是根据 陈皓 来写的实例:

点击(此处)折叠或打开

  1. /*
  2.  *
  3.  * Filename: y.cpp
  4.  *
  5.  * Description: 查虚函数表
  6.  *
  7.  * Version: 1.0
  8.  * Created: 02/29/2013 03:48:48 PM
  9.  * Revision: none
  10.  * Compiler: gcc(g++)
  11.  *
  12.  * Author: |Zhenha Zhang|, |zhangzhenha@xxx.com|
  13.  * Company: |Shenzhen XXX Technology Co., Ltd.|
  14.  *
  15.  */


  16. #include <iostream>

  17. using namespace std;

  18. typedef void (*fun)();


  19. class Base
  20. {
  21.     public:
  22.         virtual void f() { cout<<"Base::f()"<<endl; }
  23.         virtual void g() { cout<<"Base::g()"<<endl; }
  24.         virtual void h() { cout<<"Base::h()"<<endl; }
  25. };

  26. void *getp(void* p)
  27. {
  28.     return (void*)*(unsigned long*)p;
  29. }

  30. fun getfun (Base* obj, unsigned long off) //返回函数指针
  31. {
  32.     void *vptr = getp(obj);
  33.     unsigned char *p = (unsigned char *)vptr;
  34.     p += sizeof(void*) * off;
  35.     return (fun)getp(p);
  36. }

  37. int main()
  38. {
  39.     Base *p = new Base;
  40.     fun f = getfun(p, 0);
  41.     (*f)();
  42.     f = getfun(p, 1);
  43.     (*f)();
  44.     f = getfun(p, 2);
  45.     (*f)();
  46.     delete p;

  47.     return 0;
  48. }


阅读(114) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~