C++中有函数指针,申明方式如下:
void(*p)(float) 其中p就是一个函数指针,如果我们定义一个函数
void fun(float) 那么我们可以p = fun 或者p = &fun来给p赋值
于此同时还有一个概念叫做成员函数指针,这个指针和函数指针类似,所不同的是它是一个指向类的成员函数的指针,其声名方式如下:
void (class_name::*p)(float) 这就代表p是一个指向class_name类中形如void fun_name(float)的函数的函数指针
赋值的方式是加入cat类中有一个show函数
class cat {
public:
void show();
}
void (cat::*p)();
p = &cat::show;来给p赋值
这样p就指向了show代码片段所在的地址
调用时可以这样使用:
cat cat1;
(cat1.*p)();就会调用cat类中的show函数了,注意由于调用运算符()优先级比*号高,所以需要将cat1*p用括号括起来。
还有一种用法可以用来模拟java中的发射来达到回调的目的:
比如我们有一个animal类
class animal {}
cat类继承自animal
class cat :public animal {
public:
void show();
}
那么我们可以声名一个父类的成员函数指针
void(animal::*p)();
而在赋值的时候实际传得是子类中的成员函数值
p = static_cast<void(animal::*)()> (&cat::show); 注意需要用static_cast进行转换,否则编译不通过
当我们实际去调用时比如:
cat cat1;
(cat1.*p)();会调用子类中的show函数;
这样就可以把所有子类的成员函数指针都转化成一个公共基类的成员函数指针,从而实现回调子类成员函数的功能。