怎样获得虚函数指针

转载 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的函数指针。

怎样获得虚函数指针

先还是看看下面的代码:  #include  using namespace std;   class A { private:          int a;        ...
  • diaoguangqiang
  • diaoguangqiang
  • 2013年11月27日 14:13
  • 396

c++中虚表指针与虚函数详解

1.c++类中的重载  看看下面的代码: #include using namespace std; class Vehicle { publi...
  • best_fiends_zxh
  • best_fiends_zxh
  • 2017年03月01日 17:07
  • 633

0053 关于虚继承与虚函数占用字节的探索

1、为什么要引入虚拟继承虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空...
  • gendlee1991
  • gendlee1991
  • 2016年07月30日 11:37
  • 167

虚函数表存在的位置,初始化时机

转zhttp://blog.csdn.net/lingfengtengfei/article/details/12345809 1.虚函数 ·虚表是怎么实现的?虚表存放在哪里? ...
  • guogaoan
  • guogaoan
  • 2014年09月22日 15:05
  • 1496

单继承与多继承中的虚函数表和虚函数指针

首先,我们了解一下何为单继承,何为多继承??单继承:一个子类只有一个直接父类。多继承:一个子类有两个或多个直接父类。单继承中的虚函数表分析:示例程序:#include  using namespace...
  • fucangzxx
  • fucangzxx
  • 2016年05月29日 21:35
  • 295

获取虚函数指针

先还是看看下面的代码:  #include using namespace std;   class A { private:          int a;          ...
  • your8686
  • your8686
  • 2012年09月16日 21:48
  • 311

(Boolan) C++ 类型大小和内存分布(虚函数指针、虚表、内存对齐问题)

题目要求 回答: (以下大部分都是基于x64编译器下的windows平台的gcc version 5.3.0 (GCC)编译器的测试结果,不能其他平台也能得出完全一致的结论,如果在x32下编译结果会...
  • Toonle
  • Toonle
  • 2017年08月23日 21:09
  • 198

怎样获得程序文件名

在linux操作系统中,命令行的第一个参数是程序的路径名,并不是程序的文件名。 先上代码在说明。 #include #include char *basename(char *full_n...
  • jiamantuo
  • jiamantuo
  • 2017年04月09日 17:22
  • 80

怎样获得积分啊。

想下几本书没有积分。谢谢。
  • szcoolfire
  • szcoolfire
  • 2009年03月17日 18:48
  • 179

怎样获得下载积分

本人新手,刚注册了这个博客,本想能下载里面的资源,可是还要积分,没有相应的积分,求各位大神们指点怎样获得积分,不胜感激!!!!!...
  • C2015N
  • C2015N
  • 2015年01月30日 21:58
  • 1041
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:怎样获得虚函数指针
举报原因:
原因补充:

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