函数指针与虚函数表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数指针与虚函数表相关的知识,希望对你有一定的参考价值。
函数指针
定义方式
typedef 返回值类型(* 新类型名称)(参数列表)
typedef char (*PTRFUN)(int); PTRFUN pFun; char glFun(int a){ return;} void main() { pFun = glFun; (*pFun)(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++ 多态 : 虚函数静态绑定动态绑定单/多继承下的虚函数表