成员函数指针的解引用怎么理解?

下面一段代码调用display函数,对「(p->*pf)();」这个语句非常不理解。pf是一个指向Base类成员函数的指针变量,那*pf代表基类的成员函数咯,是应该理解成函数名print,还是理解成整个函数print()呢?用基类指针变量接收基类或派生类对象的地址,使用指针指向运算符是为了找到对象成员,但整个p->*pf后面又跟了一个括号构成(p->*pf)()是表示(p->*pf)只是个函数名吗?代码如下,有附图:#include <iostream>using namespace std;class Base {public: virtual void print() { cout << "Base-print" << endl; }};class Derived :public Base {public: void print() { cout << "Derived-print" << endl; }};void display(Base* p, void(Base::* pf)()) { (p->*pf)();}int main() { Derived d; Base b; display(&d, &Base::print); //输出Derived-print display(&b, &Base::print); //输出Base-print return 0;}
最新回答
迷路的信

2021-03-27 07:27:48

p是指向Base类(及其子类)的对象的指针。pf是指向类Base的成员函数的指针,就是说pf是指向函数的指针,但只能用它指向Base的成员函数,当然这个成员函数还得满足pf定义的签名,即不需要参数且返回类型是void。

那么p->的意思就是引用p指向的对象的某个成员(可以是数据成员,也可以是函数成员)。比如p->print();,可以理解为调用p指向的对象的方法print。但这里需要注意的一点是:print是虚函数且p可以指向子类,因此,实际调用的可能是print方法的子类版本。

因pf是指向Base类的成员函数的指针,所以,*pf就是pf指向的成员函数。
而(p->*pf)();就是调用p指向的对象的由pf指向的成员函数。简单讲就是,调用p指向的对象的一个成员函数,但这个成员函数究竟是哪个,由指针pf给出。