方法重載
21. 辨別方法重載
在調(diào)用重載方法時喧锦,編譯器會根據(jù)方法的參數(shù)個數(shù)抓督、參數(shù)類型和方法屬性(const 方法),來區(qū)分不同的方法铃在,這 3 項也被稱為方法的簽名阵具。這里需要注意的是方法的簽名不包含方法的返回值定铜,也就是說方法返回值類型不作為區(qū)分重載方法的標記。
22. 方法重載的歧義現(xiàn)象
下面代碼有何錯誤揣炕?
class CCalc
{
public:
intAdd(int one, int two) //重載 Add 方法
{
cout<<"第一個版本的 Add 被調(diào)用" << endl;
return one + two;
}
intAdd(int one, int two)const //重載 Add 方法
{
cout<<"第二個版本的 Add 被調(diào)用" << endl;
return one + two;
}
doubleAdd(int one, int two) //重載 Add 方法
{
cout<<"第三個版本的 Add 被調(diào)用" << endl;
return one + two;
}
};
int main(int argc, char* argv[])
{
CCalc calc;
calc.Add(10, 15); //調(diào)用重載方法
return 0;
}
本題中實現(xiàn)了 3 個重載版本的 Add 方法。表面上看來第一個重載方法和第二個方法原型很相似畸陡,問題可能出在這里。其實不然丁恭,這是出題人設計的一個陷阱。問題出現(xiàn)在第一個重載方法和第三個重載方法牲览,它們的區(qū)別是方法的返回值類型不同墓陈。在進行方法重載時以參數(shù)個數(shù)跛蛋、參數(shù)類型和方法屬性(const 方法)來區(qū)分不同的方法,而不以返回值來區(qū)分痊硕。
第三個重載版本的 Add 函數(shù)出現(xiàn)錯誤。它與第一版本的 Add 函數(shù)會出現(xiàn)歧義岔绸。在執(zhí) calc.Add(10, 15);
語句時編譯器無法區(qū)分調(diào)用第一個還是第三個版本的 Add 函數(shù)理逊。