class dog{
int name;
public:
dog();
void printname();
};
dog::dog(){
cout<<"dog构造"<<endl;
};
void dog::printname() {
cout<<"dog"<<endl;
}
int nihao(){
cout<<1<<endl;
return 0;
}
int main() {
int (*func)();//普通函数指针
func=nihao;
func();
dog dog1;
dog *dogptr = &dog1;
// cout<<&dog1.printname;//报错,不能通过实例化对象获取其成员函数地址
void (dog::*p)() = &dog::printname;//只能通过 &类名::函数名 的方式得到成员函数的函数指针,这个时候不涉及任何实例化的对象,注意这里的&**
(dog1.*p)();//通过实例化的对象(this指针)使用成员函数指针
(dogptr->*p)();//调用方式2
}
普通函数的函数名就是地址,而获取成员函数地址时,需要在前面加&
,这一点容易忘
之所以要这样调用是因为
仅仅有类成员函数的内存起始地址是不够的
还要解决多重继承、虚继承而带来的类实例地址的调整问题
所以类成员函数指针在调用的时候一定要传入类实例对象
普通函数指针可以获取类中静态成员函数,赋值和上面的&dog::printname
一致