前提:(1)同一作用域
(2)函式名相同
要求:不同形參表
注:返回型別和引數的預設值不參與過載識別。函式字首的訪問控制(public/protected/private)不影響過載。在不同的名字空間宣告的函式不是過載。除 main 函式之外的任何函式都可以過載。
過載的幾種情況:
(1)形參是引用,非引用時
void func(int &x);
void func(int x);
//不屬於過載
(2)形參是const引用,非const引用時
void func(const int &x);
void func(int &x);
//屬於過載
(3)形參是普通指標,指向常量的指標時
void func(int *p);
void func(int const *p);
//屬於過載
(4)形參是常指標,指向常量的指標時
void func(int const *p);
void func(int *const p);
//屬於過載
(5)形參是普通指標,指向常量的常指標時
void func(int *p);
void func(int const * const p);
//屬於過載
(6)形參使用了typedef,沒有使用typedef時
typedefunsigned int unit
void func(unit b);
void func(unsigned int x);
//不屬於過載
特徵:(1)不同範圍(分別位於基類跟派生類)
(2)函式名相同
(3)引數形同
(4)基類函式必須有 virtual 關鍵字
只對類的建構函式或者成員函式起作用,是子類繼承父類才使用的非常有用的功能,真正和多型相關
注:過載可以針對運算子,而覆蓋不行
例:class father
virtual void functionb() const
};class child : public father
virtual void functionb() const
};//在父類物件的指標指向子類物件時,father *father = new child; 如father->functiona(),則執行的是father中的實現;father->functionb(),則執行的是child中的實現
//如果直接宣告子類物件,child child; 則無論child.functiona()還是child.functionb(),執行的都是child中的實現
條件:(1)派生類的函式與基類函式重名,但是引數不同,此時,無論有無關鍵字virtual,基類的函式將被隱藏(注意跟過載的區別,作用域)
(2)派生類的函式與基類函式重名,並且引數也相同,但是基類沒有virtual關鍵字,此時,基類函式被隱藏(注意跟覆蓋的區別,virtual關鍵字)
例子:#include
using namespace std;
class base
;class derived:public base
;int main()
(1)過載:發生在乙個類中
(2)覆蓋:發生在基類跟派生類之間,父類函式要加virtual,不然呼叫還是父類函式,並且是在父類指標指向子類物件時發生
(3)隱藏:發生在基類和派生類之間,但是基類函式沒有virtual關鍵字,而且是在派生類指標指向派生類物件時發生
c 過載 覆蓋 隱藏
成員函式的過載 覆蓋與隱藏 成員函式的過載 覆蓋 override 與隱藏很容易混淆,c 程式設計師必須要搞清楚 概念,否則錯誤將防不勝防。8.2.1 過載與覆蓋 成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。覆蓋是指派生類函...
c 過載 覆蓋 隱藏
成員函式的過載 覆蓋與隱藏 成員函式的過載 覆蓋 override 與隱藏很容易混淆,c 程式設計師必須要搞清楚 概念,否則錯誤將防不勝防。8.2.1 過載與覆蓋 成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。覆蓋是指派生類函...
c 過載 覆蓋 隱藏
成員函式的過載 覆蓋與隱藏 成員函式的過載 覆蓋 override 與隱藏很容易混淆,c 程式設計師必須要搞清楚概念,否則錯誤將防不勝防。成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。覆蓋是指派生類函式覆蓋基類函式,特徵是 1...