貌似C++中的成员函数指针是没有多态性的,也就是说不能进行下面的赋值:
class base{
};
class test:public base{
public:
int SayHello(int n){
cout<<"hello world"<<n<<endl;
}
};
int main(void){
int (base::*bp)(int) = &test::SayHello;//貌似c++中的成员函数指针没有多态性,这条赋值语句是错误的
return 0;
}
但是如果要实现用父类的指针去调用之类的成员函数指针怎么办呢,可以用下面的方法:
typedef int(*Ptr)(void* ob,int);
int main(void){
void* p =(void*)(&test::SayHello);
Ptr bp = (Ptr)p;
test t;
base* p = &t;
bp(p,1);
return 0;
}
也许大家会奇怪为什么会用到typedef int(*Ptr)(void* ob,int); 吧...这就要说到在C++中对象是如何 去调用类中的成员函数的,其实在C++中类的成员函数是不占对象的空间的,
也就是说类的成员函数是外部的,当用于调用类的成员函数时,会把自己的this指针也一并传过去.如下:
//
test t;
t.SayHello(1);//实际上是执行了 SayHello(&t,1);所以这也是为什么我们将成员函数指针最终转化为了 int (*Ptr)(void*ob,int);第一个参数相当与this指针