怎样获得虚函数指针

转载 2012年03月28日 23:17:33

先还是看看下面的代码: 

#include <iostream>

using namespace std;

 

class A

{

private:

         int a;

         int b;

public:

         virtual void vfun0()

         {

                   cout << "A::vfun0" << endl;

         }

 

         virtual void vfun1()

         {

                   cout << "A::vfun1" << endl;

         }

};

 

// 定义一个函数指针类型fun,此类函数没有参数,返回类型为void

typedef void (*fun)();

 

fun getVirtualFunction(A* obj, unsigned long offset)

{

         // 1. obj就是类A的对象地址,而vfptr总是在一个对象内存布局的最前面,因此obj其实也就是vfptr的开始;

         // 2. 32-bit的操作系统中,地址空间也是32-bit的,我们知道long4Bytes,因此(unsigned long*)obj就是vfptr

         //    指针(即包括obj及其后面3Bytes的内容,unsigned long*从本质上说,就是限定包括obj及其后面3Bytes

         //    内容作为vfptr指针)

         // 3. *(unsigned long*)obj,就是vfptr指针中的内容,其中前4Bytes也就是virtual table的起始地址;

         // 4. (unsigned long *)(*(unsigned long*)obj)取得virtual table4Bytes地址,也就是虚函数表中第一项,它也

         //    是一个指针,这个指针指向第一个虚函数的地址,也就是说该指针的内容为第一个虚函数的指针;如果offset = 1

         //    那么(unsigned long *)(*(unsigned long*)obj) + offset就是虚函数表中第二项,它是一个指向第二个虚函数地

         //    址的指针,依此类推;

unsigned long* vtbl = (unsigned long *)(*(unsigned long*)obj) + offset;

         // 5. 4,如果vtbl是虚函数表中第一项,那么*(vtbl)就是第一个虚函数的指针,通过(fun)转化成为一个无参数,返回

         //    值类型为void的函数指针,以此类推。

         fun p = (fun) *(vtbl);

         return p;

}

 

int main(void)

{

         A a;

         cout << "Size of class A = " << sizeof(a) << endl;

         cout << &a << endl;

 

         getVirtualFunction(&a, 0)();

         getVirtualFunction(&a, 1)();

 

         return 0;

}

运行结果:

怎样获得虚函数指针 - 玄机逸士 - 玄机逸士博客

  

我们可以看到,通过

getVirtualFunction(&a, 0)();

getVirtualFunction(&a, 1)();

成功地调用了class A中的两个虚函数vfun0和vfun1。getVirtualFunction(&a, 0)和getVirtualFunction(&a, 1)分别就是vfun0和vfun1的函数指针。

相关文章推荐

C++中通过溢出覆盖虚函数指针列表执行代码

1.  C++中虚函数的静态联编和动态联编     2.  VC中对象的空间组织和溢出试验     3.  GCC中对象的空间组织和溢出试验     4.  参考          C++...

获取虚函数指针

先还是看看下面的代码:  #include using namespace std;   class A { private:          int a;          ...

C++多态总结:多态原理、虚函数指针、重载重写 ,赋值兼容性原则

 问题引出:赋值兼容性遇上函数重写 #include "iostream" using namespace std; //定义一个子类和一个父类...

C++虚函数指针虚函数表

C++的多态可以分为静态多态和动态多态。函数重载和运算符重载实现的多态属于静态多态,而通过虚函数可以实现动态多态。实现函数的动态联编其本质核心则是虚表指针与虚函数表。   1. 虚函数与纯虚函数区别 ...

C语言函数指针

  • 2012年10月07日 13:19
  • 15KB
  • 下载

C语言函数指针

  • 2013年07月14日 23:23
  • 25KB
  • 下载

LinuxC/C++编程基础(1) 函数指针实现复数的加减乘除

一.复数结构体的定义,如下,代码简单明了,无需赘述: #ifndef COMPLEXDATA_H_ #define COMPLEXDATA_H_ #include namespa...

函数指针定义

  • 2012年03月04日 09:45
  • 39KB
  • 下载

状态机与编程以及函数指针数组的妙用

转自:http://kb.cnblogs.com/page/528971/   状态机的概念   状态机是软件编程中的一个重要概念,比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的...
  • zjzto
  • zjzto
  • 2016年07月01日 11:10
  • 1140
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:怎样获得虚函数指针
举报原因:
原因补充:

(最多只允许输入30个字)