C++ 类的成员函数指针

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一致

posted @ 2023-01-24 16:00  ecnu_lxz  阅读(50)  评论(0编辑  收藏  举报