出現在相同作用域中的兩個函式,如果具有相同的名字而形參表不同,則稱為過載函式。
作用:省去了為函式起名並記住函式名字的麻煩,簡化了程式的實現,使程式更容易理解。
注意:main函式不能過載;函式不能僅僅基於不同的返回值型別而實現過載;進行函式過載時,要求同名函式在引數個數上不同,或者引數型別上不同;區域性宣告的函式將遮蔽而不是過載在外層作用域中宣告的同名函式。
int add(int, int);
double add(double, double);
過載確定的三個步驟:
1、候選函式
確定該呼叫所考慮的過載函式集合。
2、選擇可行函式
可行函式必須滿足的條件:函式的形參個數與該呼叫的實參個數相同;每乙個實參的型別必須與對應形參的型別匹配,或者
可被隱式轉換為對應的形參型別。
3、尋找最佳匹配
實參型別與形參型別越接近則匹配越佳。
為了確定最佳匹配,編譯器將實參型別到相應形參型別的轉換劃分等級,降序排列如下:
1)精確匹配(exact match)。實參與形參型別相同。
2)通過型別提公升(promotion)實現的匹配。
3)通過標準轉換(standart conversion)實現的匹配。
4)通過類型別轉換(class-type conversion)實現的匹配。
注意:無法將整型值傳遞給列舉型別的形參,但可以將列舉值傳遞給整型形參,此時,列舉值被提公升為int型或更大的整型。
enum id;
void fun(id);
void fun(int);
int main()
僅當形參是引用或指標時,可基於函式形參是指向const物件還是指向非const物件,實現函式過載,但是不能基於指標本身是否為const來實現函式的過載。
fun(int *);
fun(int * const);//重複宣告
附:運算子過載——
1、除了. .* :: ?: sizeof typeid這幾個運算子不能被過載,其他運算子都能被過載。每個類都保持著自己的作用域,在該作用域中定義了成員的名字。在繼承情況下,派生類的作用域巢狀在基類作用域中。如果不能再派生類作用域中確定名字,就在外圍基類作用域中查詢該名字的定義。2、過載不能改變該運算子用於內建型別時的含義,程式設計師不能改變運算子+用於兩個int型時的含義。
3、運算子函式的引數至少有乙個必須是類的物件或者類的物件的引用。這種規定可以防止程式設計師運用運算子改變內建型別的含義。
4、過載不能改變運算子的優先順序。
5、過載不能改變運算子的結合律。
6、過載不能改變運算子運算元的個數。比如+需要兩個運算元,則過載的+也必須要有兩個運算元。
與基類成員同名的派生類成員將遮蔽對基類成員的直接訪問,但可以使用域操作符訪問被遮蔽成員。
在基類和派生類中使用同一名字的成員函式,其行為與資料成員一樣:在派生類作用域中派生類成員將遮蔽基類成員。規則如下:
1) 如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無virtual關鍵字,基類的函式將被隱藏(注意別與過載混淆)。
2) 如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆)。
class base
int mem;
};
class derived : public base
int mem;
};int main()
執行結果如下:
函式覆蓋發生在父類與子類之間,其函式名、引數型別、返回值型別必須同父類中的相對應被覆蓋的函式嚴格一致,覆蓋函式和被覆蓋函式只有函式體不同,當派生類物件呼叫子類中該同名函式時會自動呼叫子類中的覆蓋版本,而不是父類中的被覆蓋函式版本,這種機制就叫做函式覆蓋。
覆蓋的特徵有:
1) 不同的範圍(分別位於派生類與基類);
2) 函式名字相同;
3) 引數相同;
4) 基類函式必須有virtual關鍵字。
#include using namespace std;
class base
函式base::f(int)與base::f(float)相互過載,而base::g(void)被derived::g(void)覆蓋。
參考:c++ primer 第四版
函式過載 覆蓋與隱藏
overload 翻譯過來就是 超載,過載,過載,超出標準負荷 override 翻譯過來是 重置,覆蓋,使原來的失去效果。先來說說過載的含義,在日常生活中我們經常要清洗一些東西,比如洗車 洗衣服。儘管我們說話的時候並沒有明確地說用洗車的方式來洗車,或者用洗衣服的方式來洗一件衣服,但是誰也不會用洗衣...
函式過載 覆蓋與隱藏
1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 有無virtual關鍵字不影響。呼叫實參與形參符合的那個函式。覆蓋是指派生類函式覆蓋基類函式。1 不同的範圍 分別位於派生類與基類 2 函式名字相同 3 引數相同 4 基類函式必須有ovirtual關鍵字,否則就是隱藏了。1 當派生類...
過載 覆蓋與隱藏
一 總結如下表 函式名均相同 引數返回值型別 virtual有無 類別父類子類間 方法為public 繼承為public同同 必須有override同異 有編譯不通過同 均可無hide異均可 無關hide 同一類內同異 無關編譯不通過異 均可無關 overload 二 幾點說明 override 重...