首先闡述一下各自的定義:
一、過載
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 如果派生類...