C 中成員函式的過載 覆蓋與隱藏

2021-05-23 05:26:10 字數 1647 閱讀 1867

首先闡述一下各自的定義:

一、過載

1、範圍相同(在同乙個類裡,不能跨類)。

2、函式名字相同。

3、引數不同。

4、virtual 關鍵字可有可無。

二、覆蓋

1、範圍不同(派生類與基類)。

2、函式名相同。

3、引數相同。

4、基類必須有 virtual 關鍵字。

三、隱藏

隱藏分兩種情況:

(1)1、範圍不同(派生類與基類)。

2、函式名字相同。

3、引數不同。

4、virtual 關鍵字可有可無。

(2)1、範圍不同(派生類與基類)。

2、函式名相同。

3、引數相同。

4、基類沒有 virtual 關鍵字。

下面我們看看過載和覆蓋的示例:

#include

using namespace std;

class cbase

輸出的結果為:

cbase::f(int) 10

cbase::f(int) 10.1

cderived::g(void)

這說明子類的 g(void) 函式覆蓋了父類的 g(void)。

再看看覆蓋和隱藏的示例:

#include

using namespace std;

class cbase

輸出的結果為:

cderived::f(float) 20.2

cderived::f(float) 20.2

cbase::g(float) 30.3

cderived::g(int) 30

cbase::h(float) 40.4

cderived::h(float) 40.4

上面的例子中 子類 cderived 的函式 f(float) 覆蓋了父類的 f(float)

函式 g 和 f 依賴於指標的型別,如果是子類的指標,則隱藏了父類的函式。

隱藏的麻煩和解決辦法:

#include

using namespace std;

class cbase

說明:語句 pd->f(100); 的本意是呼叫 cbase::f(int),但是 cbase::f(int) 不幸被 cderived::f(char*) 隱藏了。由於數字 100 不能被隱式的轉換為字串,所以編譯出錯。

隱藏規則至少有兩個存在的理由:

(1)  寫語句 pd->f(100); 的人可能真的想呼叫 cderived::f(char*) 函式,只是他把引數寫錯了。有了隱藏規則,編譯器可以明確的指出錯誤,這對我們來說是一件好事。如果編譯器將錯就錯,程式設計師很難發現這個錯誤,留下禍根。

(2)  假如 cderived 類有多個基類,有時搞不清哪些基類定義了函式 f。如果沒有隱藏規則,那麼 pd->f(100) 可能會呼叫乙個出乎意料的基類函式 f。儘管隱藏規則看起來不怎麼有道理,但它的確能消滅這些意外。

解決辦法: 如果在上面的例子中,一定要用 pd->f(100); 呼叫cbase::f(int),那麼可以這樣修改 cderived 類:

class cderived:public cbase

};

C 成員函式的過載 覆蓋與隱藏

成員函式的過載 覆蓋 override 與隱藏很容易混淆,c 程式設計師必須要搞清楚概念,否則錯誤將防不勝防。成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。覆蓋 派生類函式覆蓋基類函式,特徵是 1 不同的範圍 分別位於派生類與...

C 成員函式的過載 覆蓋與隱藏

成員函式的過載 覆蓋 override 與隱藏很容易混淆,c 程式設計師必須要搞清楚概念,否則錯誤將防不勝防。成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。覆蓋 派生類函式覆蓋基類函式,特徵是 1 不同的範圍 分別位於派生類與...

C 成員函式的過載 覆蓋與隱藏

一 成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual關鍵字可有可無。二 成員函式被覆蓋的特徵 1 不同的範圍 分別位於派生類與基類 2 函式名字相同 3 引數相同 4 基類函式中必須有virtua 關鍵字。三 成員函式被隱藏的規則 1 如果派生類...