(1).将 “类”的成员函数指针赋予同类型非成员函数指针,如:
例子1
#include <stdlib.h>
typedef void (*Function1)( ); //定义一个函数指针类型。
Function1 f1;
class Test1
{
public:
//…被调用的成员函数。
void Memberfun1( ){ printf("%s n","Calling Test3::Memberfun2 OK");}; //
void Memberfun2()
{
f1=reinterpret_cast<Function1>(Memberfun1);//将成员函数指针赋予f1。编译出错。
f1();
}
//…
};
int main()
{
Test1 t1;
t1.Memberfun2();
return 0;
}
(2) 在一个“类”内,有标准库函数,如qsort, 或其他全局函数,用函数指针调用类的成员函数。如:
例子2:
#include <stdlib.h>
class Test2
{
private:
int data[2];
//…
public:
//…
int __cdecl Compare(const void* elem1, const void* elem2) //成员函数。
{
printf("%s n","Calling Test2::Memberfun OK");
return *((int*)elem1)- *((int*)elem2) ;
}
void Memberfun()
{
data[0]=2; data[1]=5;
qsort( data, 2, sizeof(int), Compare); //标准库函数调用成
//员函数。编译出错。
}
//…
};
int main( )
{
Test2 t2;
t2.Memberfun(); //调用成员函数。
return 0;
}
(3)同一个“类”内,一个成员函数调用另一个成员函数, 如:
例子3:
#include "stdlib.h"
class Test3
{
public:
//…
void Memberfun1( void (* f2)( ) ) { f2( ) ;} //成员函数1调用成员函数//2。
void Memberfun2( ) { printf("%s n","Calling Test3::Memberfun2 OK");} //成员函数2。
void Memberfun3( ) { Memberfun1( Memberfun2);} // 编译出错
//…
};
int main( )
{
Test3 t3;
t3.Memberfun3(); //调用成员函数。
return 0;
}
以上三种情况的代码语法上没有显著的错误,在一些较早的编译环境中,如,VC++ 4.0, 通常可以编译通过,或至多给出问题提醒(Warning)。后来的编译工具,如,VC++6.0和其他一些常用的C++编译软件,不能通过以上代码的编译, 并指出错误如下(以第三种情况用VC++ 6.0编译为例):
error C2664: 'Memberfun1' : cannot convert parameter 1 from 'void (void)' to 'void (__cdecl *)(void)'
None of the functions with this name in scope match the target type
即:Memberfun1参数中所调用的函数类型不对。










