天天看點

C++中怎麼擷取類的成員函數的函數指針?

用一個實際代碼來說明。

<a href="http://www.dewen.org/q/4538/C%2B%2B%E4%B8%AD%E6%80%8E%E4%B9%88%E8%8E%B7%E5%8F%96%E7%B1%BB%E7%9A%84%E6%88%90%E5%91%98%E5%87%BD%E6%95%B0%E7%9A%84%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88%EF%BC%9F"></a>

class A

{

public:

    staticvoid staticmember(){cout&lt;&lt;"static"&lt;&lt;endl;}   //static member

    void nonstatic(){cout&lt;&lt;"nonstatic"&lt;&lt;endl;}          //nonstatic member

    virtualvoid virtualmember(){cout&lt;&lt;"virtual"&lt;&lt;endl;};//virtual member

};

int main()

    A a;

    //static成員函數,取得的是該函數在記憶體中的實際位址,而且因為static成員是全局的,是以不能用A::限定符

    void(*ptrstatic)()=&amp;A::staticmember;      

    //nonstatic成員函數 取得的是該函數在記憶體中的實際位址    

    void(A::*ptrnonstatic)()=&amp;A::nonstatic;

    //虛函數取得的是虛函數表中的偏移值,這樣可以保證能過指針調用時同樣的多态效果

    void(A::*ptrvirtual)()=&amp;A::virtualmember;

    //函數指針的使用方式

    ptrstatic();

    (a.*ptrnonstatic)();

    (a.*ptrvirtual)();

}

可以參考《C++ Primer(3rd)》第532頁13.6指向類成員的指針一節~

1.一個指向外部函數的指針聲明為:

void(*pf)(char*,constchar*);

void strcpy(char* dest,constchar* source);

pf=strcpy;

2.一個指向類A成員函數的指針聲明為:

void(A::*pmf)(char*,constchar*);

聲明的解釋是:pmf是一個指向A成員函數的指針,傳回無類型值,函數帶有二個參數,參數的類型分别是char * 和 const char *。除了在星号前增加A:: ,與聲明外部函數指針的方法一樣。

3.給成員指針指派的方法是将函數名通過指針符号&amp;賦予指針名。

如下所示:

  public:

   void strcpy(char*,constchar*);

   void strcat(char*,constchar*);

pmf =&amp;A::strcpy;

繼續閱讀