函数指针与虚函数表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数指针与虚函数表相关的知识,希望对你有一定的参考价值。

函数指针

定义方式

typedef 返回值类型(* 新类型名称)(参数列表)

typedef char (*PTRFUN)(int); 
PTRFUN pFun; 
char glFun(int a){ return;} 
void main() 
{ 
    pFun = glFun; 
    (*pFun)(2); 
} 

调用方式:

  1. 直接把函数指针变量当作函数名,然后填入参数
  2. 将函数指针的反引用作为函数名,然后填入参数

上面的PTRFUN也可直接进行以下调用:

  PTRFUN(2); 

 

函数调用方式

函数名就是函数的地址,是一个编译时的常量,“函数连接”的本质就是把函数地址绑定到函数的调用语句上。

静态连接:一般的函数调用语句可以在编译的时候就完成这个绑定,这就是静态连接。

运行时连接&动态连接:

函数指针可以理解为一个新的类型,由其定义的变量,与其他变量一样,在编译期间是没有值的,因此函数指针与函数体的绑定关系只有到了运行时才确定。

对于函数指针数组,此特征表现的尤为明显,见《高质量程序设计指南》P135

class CTest
{
   public:
         void f(void){cout<<"CTest::f()"<<endl;} //普通成员函数
         static void g(void) {cout<<"CTest::g()"<<endl;} //静态成员函数
         virtual void h(void) {cout<<"CTest::h()"<<endl;} //虚拟成员函数

    private:
         //..........  
};

void main()
{
   typedef void (*GFPtr)(void);     //定义一个全局函数指针类型
   GFPtr fp = CTest::g;                 //取静态成员函数地址的方法和取一个全局函数的地址相似
   fp();                                         //通过函数指针调用类静态成员函数
   typedef void (CTest::*MemFuncPtr)(void)//声明类成员函数指针类型
   MemFuncPtr mfp_1 = &CTest::f;               //声明成员函数指针变量并初始化
   MemFuncPtr  mfp_2 = &CTest::h;             //注意获取成员函数地址的方法
   CTest theObj;
   (theObj.*mfp_1)();                //使用对象和成员函数指针调用成员函数
   (theObj.*mfp_2)();
   CTest* pTest = &theObj;
   (pTest->*mfp_1)();              //使用对象指针和成员函数指针调用成员函数
   (pTest->*mfp_2)();
}

  

以上是关于函数指针与虚函数表的主要内容,如果未能解决你的问题,请参考以下文章

虚函数与虚析构函数原理

C++程序设计POJ》《WEEK6 多态与虚函数》《多态的实现原理》《虚函数表》

虚继承与虚函数继承

C++ 多态 : 虚函数静态绑定动态绑定单/多继承下的虚函数表

C++ 多态 : 虚函数静态绑定动态绑定单/多继承下的虚函数表

C++ 多态 : 虚函数静态绑定动态绑定单/多继承下的虚函数表