需要注意:
1)函数指针所指向的函数,必须为全局函数或类的静态函数。
代码:
#include "stdafx.h"
#include <iostream>

class A


{
typedef int (*fun)(void);

public:
void Test(fun fun1)

{
(*fun1)();
};

static int add(void)

{
std::cout<<"A::add()"<<std::endl;
return 2;
}
};

int add2(void)


{
std::cout<<"add2()"<<std::endl;
return 2;
}
static int add3(void)

{
std::cout<<"add3()"<<std::endl;
return 3;
}


int _tmain(int argc, _TCHAR* argv[])


{
A a;
a.Test(A::add);
a.Test(add2);
a.Test(add3);
return 0;
}
//output
//A::add()
//add2()
//add3()
//Press any key to continue . . .
成员函数指针:
#include "stdafx.h"

class CMemFuncPtr;

typedef int (CMemFuncPtr::*MemFuncPtr)(int, int);

class CMemFuncPtr


{
public:
int Add(int iFirst, int iSecond)


{
return iFirst + iSecond;
}
};

int _tmain(int argc, _TCHAR* argv[])


{
MemFuncPtr pfnMemFunc = &CMemFuncPtr::Add;
CMemFuncPtr test;
(test.*pfnMemFunc)(1, 3);

return 0;
}

other samples:
#include "stdafx.h"

class Object;
typedef int (Object::*MemFuncPtr)(int, int);
typedef int (*StaticMemFuncPtr)(int, int);

class Object


{
public:
// non-static member
int Add(int iFirst, int iSecond)


{
return iFirst + iSecond;
}
// static member
static int Sub(int iFirst, int iSecond)


{
return iFirst - iSecond;
}

//
typedef int (Object::*InClassMemFuncPtr)(int, int);
typedef int (*InClassStaticMemFuncPtr)(int, int);
};

int _tmain(int argc, _TCHAR* argv[])


{
// Test non-static Add
//
MemFuncPtr pfnMemFunc = &Object::Add;
// Need to bind the member function to a instance (need a this pointer)
Object test;
int res = (test.*pfnMemFunc)(1, 3);

// function call missing argument list; use '&Object::Add' to create a pointer to member
//MemFuncPtr pfnMemFunc1 = test.Add;
//res = (test.*pfnMemFunc1)(1, 3);

Object::InClassMemFuncPtr pfnMemFunc2 = &Object::Add;
res = (test.*pfnMemFunc2)(1, 3);

// Test Static Sub
//
// cannot convert from 'int (__cdecl *)(int,int)' to 'MemFuncPtr'
// Object::Sub Calling convention is __cdecl, but Object::*MemFuncPtr should be thisCall
// function signature include calling convention, parameter list and return value..

//pfnMemFunc = Object::Sub;
//res = (test.*pfnMemFunc)(1, 3);

StaticMemFuncPtr pfnStaticMemFunc = Object::Sub;
res = (*pfnStaticMemFunc)(1, 3);

StaticMemFuncPtr pfnStaticMemFunc1 = &Object::Sub;
res = (*pfnStaticMemFunc1)(1, 3);

Object::InClassStaticMemFuncPtr pfnStaticMemFunc2 = &Object::Sub;
res = (*pfnStaticMemFunc2)(1, 3);


// stl ? how to use this “function pointer”???
//std::mem_fun<int, Object>(&Object::Add);
//std::mem_fun<int, Object>(&Object::Sub);

return 0;
}

总结:
1)一般的全局的函数指针,只可以使用静态,全局的函数。
2)类的成员函数指针,可以使用类的成员函数。可以使用类的public成员函数指针。