今天学了一下成员函数指针编程,特将代码记在此处,代码不太严格,阅读过的网友不要简单抄录 例子1: #include "stdafx.h" class CModule; typedef void (CModule::*pMMdFunc)(); class CModule { public: CModule(){} ~CModule(){} void CallMemFunc(pMMdFunc pFunc){(this->*pFunc)();}//注意里面的括号 }; class X : public CModule { public: X(){} ~X(){} void Hello(){printf("hello world!/n");} }; class Y : public CModule { public: Y(){} ~Y(){} void Hello(){printf("hello kity!/n");} }; int main(int argc, char* argv[]) { X x; Y y; x.CallMemFunc((pMMdFunc)(&X::Hello));//注意转换和地址符 y.CallMemFunc((pMMdFunc)(&Y::Hello)); return 0; } 例子2: #include "stdafx.h" #include <string.h> class FBase; typedef void (FBase::*pMsgFunc)(); class FBase { public: }; class FD1 : public FBase { public: void Hello(){printf("hello/n");} }; class FD2 : public FBase { public: void Kity(){printf("Kity/n");} }; class FManager { public: struct g { g(){sz[0] = 0; pfunc = NULL;pobj = NULL;} char sz[32]; FBase* pobj; pMsgFunc pfunc; }; g x[10]; void Register(char* psz, FBase* pobj, pMsgFunc pfunc) { for (int _i = 0; _i < 10; _i++) { if (!*x[_i].sz && !x[_i].pobj && !x[_i].pfunc) { strncpy(x[_i].sz, psz, 31); x[_i].pfunc = pfunc; x[_i].pobj = pobj; break; } } } void callMsgFunc(char* psz) { for (int _i = 0; _i < 10; _i++) { if (!strcmp(psz, x[_i].sz)) { ((x[_i].pobj)->*(x[_i].pfunc))(); return; } } } }; class Space { public: Space() { m.Register("h", &d1, (pMsgFunc)(&FD1::Hello)); m.Register("k", &d2, (pMsgFunc)(&FD2::Kity)); } void call(char* psz) { m.callMsgFunc(psz); } private: FManager m; FD1 d1; FD2 d2; }; int main(int argc, char* argv[]) { Space s; s.call("h"); s.call("k"); s.call("nonuse"); return 0; }