问题:在项目开发中,试图把类的非static成员函数的指针赋值给普通函数指针变量(前提当然是函数定义是一样的),结果编译不过。
原因:类的非static成员函数包含一个隐含的this指针。在某些calling convention下,this指针作为函数的附加参数入栈,相当于多了一个参数传入。另一个更通用的解释是:非static的成员函数指针的定义和调用都需要指明作用到哪个类/具体对象上,明显与一般函数指针的定义和调用是不兼容的。我的理解是非static的成员函数指针只是一个offset,因此需要在获取对象指针的基础上进行函数调用才行。类的静态成员函数采用与一般函数指针相同的调用方式,而受this指针的影响,类的非静态成员函数与一般函数指针是不兼容的。而且,不同类的this指针是不一样的,因此,指向不同类的非静态成员函数的指针也是不兼容的。指向类的非静态成员函数的指针,在声明时就需要添加类名。
A a1, a2; A *p= &a1; // 创建指向A的指针 // 创建指向成员的指针并初始化 void (A::*pmf)( char *, const char *) = &A::strcpy; // 要将成员函数绑定到pmf,必须定义呼叫的对象。 // 可以用*号引导: void dispatcher(A a, void (A::*pmf)( char *, const char *)) { char str[ 4]; (a.*pmf)(str, “abc”); // 将成员函数绑定到pmf } // 或用A的指针表达方式指向成员指针: void dispatcher(A * p, void (A::*pmf)( char *, const char *)) { char str[ 4]; (p->*pmf)(str, “abc”); } // 函数的调用方法为: dispatcher(a, pmf); // .* 方式 dispatcher(&a, pmf); // ->* 方式
参考: