打架了!打架了!
誰跟誰打?兩個不同的概念唄。
“重載函數”是“作用域相同函數名相同而參數表不同的函數”,它弱化了返回值,強調了函數名和參數表;
“指向函數的指針”是“指向同一類型函數的指針”,它弱化了函數名,強調了返回值和參數表——因為“函數類型”是由返回值和參數表決定的;
那么,這三個元素放在一起考慮會怎樣呢?
如果僅有返回值不同,則它們是不同類型的函數,它們的地址不可以交叉給指針賦值,但是它們不屬于重載而屬于錯誤聲明;
如果僅有函數名不同,則它們是完全不相干的函數而不屬于重載,它們的地址可以給同一個指針賦值;
如果僅有參數不同,則它們是重載函數,但不屬于同一個類型,不能交叉給指針賦值。
現在要考慮用指針來指向重載函數了,你就得把重載函數的每一個成員視為相互獨立的函數。雖然給指針賦值的語句是那么相似,但是實際上被賦值的指針獲得的是某個特定的函數,而其它“同名”的函數就像不存在一樣。
void GetVal(int);//重載函數一
void GetVal(double *);//重載函數二
void GetVal(string &);//重載函數三
void (*pFun1)(int);//指針一
void (*pFun2)(double *);//指針二
void (*pFun3)(string &);//指針三
void (*pFun4)(double);//指針四
pFun1 = GetVal;//獲取函數一的地址
pFun2 = GetVal;//獲取函數二的地址
pFun3 = GetVal;//獲取函數三的地址
pFun4 = GetVal;//錯誤,沒有對應的函數可以獲取