C++之函数指针做函数参数、函数回调功能
目的是实现多态
函数指针做函数参数实现多态原理的必要条件。多态实现条件:1,有继承,2,虚函数重写,3,父类指针指向子类对象。在看C++的代码,主要是看有没有多态发生,也就是上面的3个条件。
多态原理
-
C++编译器为每一个含有虚函数的子类和父类提前布局了一个vptr指针,通过该指针找到一个虚函数表,根据虚函数表找到后面执行的代码去执行;
-
n个虚函数放在一个虚函数表中,虚函数表中存储了一个函数指针做函数参数,通过该函数指针,找到函数入口,然后执行自己写的代码(回调函数)
函数指针相关
定义一个函数类型
函数名是函数的入口地址,和指针等价
int add(1,2); //直接调用,函数名就是函数的入口地址
typedef int(MyFuncType)(int a,int b);//定义一个函数类型,返回值int
MyFuncType *myPointerFunc=NULL;//定义一个指针,指向该类型的函数
myPointerFunc=&add;//细节
myPointerFunc=add;//细节,取地址和不取地址都可以
myPointerFunc(3,4);//间接调用
定义一个函数指针类型
int add(1,2); //直接调用,函数名就是函数的入口地址
typedef int(*MyPointerFuncType)(int a,int b);//类似于int *a=null;定义一个函数指针类型,返回值int
MyPointerFuncType myPointer;//定义一个指针
myPointer=add;
myPointer(3,4);
定义一个函数指针(指向函数的入口地址)
int(*MyPointer)(int a,int b);//定义一个变量
MyPointer=add;
MyPointer(3,4);
用法
#include<iostream>
using namespace std;
int add(int a,int b){return a+b;}
int subtract(int a,int b){return a-b;}
typedef int(*MyPointerFuncType)(int a,int b);//声明函数指针类型
int func1(MyPointerFuncType myPointer)
{
cout<<myPoint(1,5)<<endl;
return 0;
};
int func2(int(*MyPointerFuncType)(int a,int b))
{
cout<<MyPointerFuncType(1,5)<<endl;
return 0;
};
int main()
{
func1(add);
func1(subtract);
fun2(add);
func2(subtract);
system("pause");
return 0;
}
作用
将任务的实现者和任务的调用者实现解耦合,达到扩展的目的。诸葛亮写锦囊在先,刘备打开锦囊,具体操作在后。