C++指向函数的指针定义方式为:
返回类型 (*指针名)(函数参数列表),例如 void (*p)(int)是指向一个返回值为void 参数为int类型的函数。
而若想定义一个指向类成员函数的函数指针该怎么定义呢?对成员函数指针的使用。
(1)非静态成员函数
定义方式:返回类型 (类名::*指针名)(函数参数列表)例如void (A::*p)(int)是一个指向A类中成员函数的函数指针。
赋值方式:p=&A::函数名,而一般的函数指针的赋值是p=函数名即可,注意区别。(成员函数必须是public类型的)
调用方式:成员函数指针的调用必须通过类对象进行调用,a.*p(int)即可调用成员函数(该成员函数是public类型的)
(2)静态成员函数
对于静态成员函数的定义和使用方法都与普通函数指针的相同,只是在赋值的时候和非静态成员们函数指针的赋值方法相同。
因为静态成员函数的指针类型是与普通函数指针类型相同的。
----------------------------------------------------------------------------------------------------------------------
对于单类型的成员函数指针的使用就是上述的内容,但是对于C++来说,继承是其三大特性之一,那么对于继承类来说,成员函数指针怎么实现动态呢?
(1)赋值问题
与正常的派生类指针或引用可以赋于基类指针或引用不同,基类成员函数可以赋于派生类成员函数指针(任何情况下都不会出错),反之派生类成员函数在未覆盖基类函数名的情况下也能赋于基类成员函数指针。如下例:
class A class B class C:public A,B
{ { {
public: public: public:
void printA(int) virtual void printB(int) void printB(int)
{ { {
} } }
}; }; };
void (A::*Pa)(int);void (B::*Pb)(int);void (C::*Pc)(int)
pa=&C::printA;(正确)相当于将C中A类对象的函数传给指针。
pb=&C::printB;(错误)因为printB已经在C类中修改,两者的类型不同
pc=&A::printA;(正确)
pc=&B::printB;(正确)
总结:只要不被派生类覆盖的函数均可以赋给基类成员函数指针。
(2)多态调用
接上例:
pb=&B::printB;
(b.*pb)(i);(调用b类中的printB)
(c.*pb)(i);(调用c类中的printB)
但是对于pc指针只能由c类对象调用,不能由基类调用。
根据对象实例的类型去判断应该调用的函数。