一直以來,我都不知道如何在外部引用成員函數(shù)的地址值,直到發(fā)現(xiàn)STL庫中的mem_func才知道如何訪問C++的成員函數(shù)的地址值。
首先必須明確一點,C++的設(shè)計是由C的設(shè)計演化而來的,所以成員函數(shù)一定是有一個地址值。看個代碼例子:
#include <iostream>
using namespace std;
class C
{
public:
void Output() const { cout << "C::Output() OK" << endl; }
};
typedef void (C::*OUT)() const;
int main(int argc, char ** argv)
{
OUT out = &C::Output;
C * c = new C;
(c->*out)();
delete c;
return 0;
}
從代碼中我們看到,我么定義了一天OUT類型的函數(shù)類型,這個類型定義的時候我們采用了和類C中Output成員函數(shù)同樣的原型。
在使用out的時候,我們使用一個類C的對象采用->*的方式調(diào)用C::Output這個成員函數(shù)。
對于這個例子有個根本性的東西,就是成員函數(shù)是有地址值的,而且這個值是可以被訪問的,訪問的方式是使用對象的->*或者.*的調(diào)用方式。這點也是mem_func的實現(xiàn)基礎(chǔ),也是對virtual的機理理解的基礎(chǔ)。C++初學(xué)者往往會忽略這個特點,這是十分有害的!!!