C 過載覆蓋隱藏

2021-08-20 06:10:35 字數 1782 閱讀 9706

前提:(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...