打架了!打架了!
誰(shuí)跟誰(shuí)打??jī)蓚€(gè)不同的概念唄。
“重載函數(shù)”是“作用域相同函數(shù)名相同而參數(shù)表不同的函數(shù)”,它弱化了返回值,強(qiáng)調(diào)了函數(shù)名和參數(shù)表;
“指向函數(shù)的指針”是“指向同一類型函數(shù)的指針”,它弱化了函數(shù)名,強(qiáng)調(diào)了返回值和參數(shù)表——因?yàn)椤昂瘮?shù)類型”是由返回值和參數(shù)表決定的;
那么,這三個(gè)元素放在一起考慮會(huì)怎樣呢?
如果僅有返回值不同,則它們是不同類型的函數(shù),它們的地址不可以交叉給指針賦值,但是它們不屬于重載而屬于錯(cuò)誤聲明;
如果僅有函數(shù)名不同,則它們是完全不相干的函數(shù)而不屬于重載,它們的地址可以給同一個(gè)指針賦值;
如果僅有參數(shù)不同,則它們是重載函數(shù),但不屬于同一個(gè)類型,不能交叉給指針賦值。
現(xiàn)在要考慮用指針來指向重載函數(shù)了,你就得把重載函數(shù)的每一個(gè)成員視為相互獨(dú)立的函數(shù)。雖然給指針賦值的語(yǔ)句是那么相似,但是實(shí)際上被賦值的指針獲得的是某個(gè)特定的函數(shù),而其它“同名”的函數(shù)就像不存在一樣。
void GetVal(int);//重載函數(shù)一
void GetVal(double *);//重載函數(shù)二
void GetVal(string &);//重載函數(shù)三
void (*pFun1)(int);//指針一
void (*pFun2)(double *);//指針二
void (*pFun3)(string &);//指針三
void (*pFun4)(double);//指針?biāo)?span lang="EN-US">
pFun1 = GetVal;//獲取函數(shù)一的地址
pFun2 = GetVal;//獲取函數(shù)二的地址
pFun3 = GetVal;//獲取函數(shù)三的地址
pFun4 = GetVal;//錯(cuò)誤,沒有對(duì)應(yīng)的函數(shù)可以獲取