工作问题积累(二十四)虚函数之进一步理解,结合汇编语言

         函数指针实例代码:http://download.csdn.net/detail/wu_123_456/7695817

         发现自己基础不扎实,着实难为情.......今天无意看到虚函数,但是忘了函数指针和获取虚函数表地址的相关操作,所以查阅资料进一步巩固。

        1.先看代码

class A

{

public:

     virtual void f()

    {

        cout<<"调用该函数的对象的地址是="<<this<<endl<<"A::f"<<endl;

    }

};

void  main()

{

     A a;

     a.f();//(1.)使用对象直接调用

    

    typedef void(*pFun)(void);//(2.)定义函数指针



    cout<<"对象a的地址:"<<(int *)(&a)<<endl;//(3.)

    cout<<"对象a的虚函数表地址:"<<(int *)*(int *)(&a)<<endl;//(4.)

      cout<<"虚函数表中第一个函数的地址"<<(pFun)*((int *)*(int *)(&a))<<endl;//(5.)


    pFun   pf;

    pf = (pFun)*((int *)*(int *)(&a));

    _asm{

          lea ecx,[ebp-4]

    }

    pf();//通过虚函数表调用f()

}


2.结果显示

 

3.解析

(一.)在上面代码中a.f();其实是两个过程:首先将对象a的地址隐式传给this指针,保存在ECX寄存器中;再调用虚函数表中的f(),如果函数中用到对象中的数据,对ECX进行访问。

(二.)lea ecx,[ebp-4]主要功能是将this指针保存到ecx寄存器中

(三.)函数指针的分析

           这里对函数指针的定义啰嗦一下,可能大家还记得,那就可以忽略这个部分。为甚么上面的函数指针定义是这样typedef void(* pFun)(void);

           这个函数指针是跟函数定义有关的。直接举几个例子,一比较一目了然。


void fun(int);//函数
typedef void (*ptr)(int);//函数指针


int add(int a,int b)

typedef int(* pFun)(int,int)


 

前面是函数返回类型,后面括号里的是函数参数的类型。

 

(四.)typedef

typedef 原变量类型 别名

简单的函数指针的用法

//形式1:返回类型(*函数名)(参数表)

char(*pFun)(int);

//typedef char(*pFun)(int)   //跟上一行功能等同

/*typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。*/

char glFun(int a){return;}

void main()

{

    pFun =glFun;

    (*pFun)(2);

}


 

第一行定义了一个指针变量pFun.它是一个指向某种函数的指针,这种函数参数是一个int类型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值

第二行定义了一个函数glFun().该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数-函数的函数名实际上就是一个指针函数名指向该函数的代码在内存中的首地址。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值