過載 覆蓋 隱藏的區別

2021-06-25 11:57:37 字數 1332 閱讀 4120

《高質量c++/c程式設計指南》已經清晰的列出了過載函式的特性:

(1)相同的範圍(在同乙個類中);

(2)函式名字相同;

(3)引數不同;

(4)virtual關鍵字可有可無。

因為函式引數不同,可以簡單的理解為:兩個過載函式是不同的函式,呼叫者能夠明確

的根據不同的引數來呼叫不同的函式。那麼如果存在這樣兩個函式,編譯器怎麼處理呢?

class a

void func(int a)

};int main()

當然,對於這樣兩個函式,呼叫者不知道應該呼叫哪個函式,故編譯器直接報錯。

我們在看看,覆蓋和隱藏分別是什麼特性呢?從字面意思來講,覆蓋和隱藏都具有乙個把另

乙個給遮住了,那只不過是誰遮誰的問題。

覆蓋,是指派生類函式覆蓋基類函式,只作用於派生類函式,其特性為:

(1)不同的範圍(分別位於派生類與基類);

(2)函式名字相同;

(3)引數相同;

(4)基類函式必須有virtual關鍵字。

我們發現,這裡用到了虛函式,實際上虛函式的作用,就是實現覆蓋。

隱藏,是指派生累函式將基類函式給藏起來了,當然只作用於派生類函式,其特性與覆

蓋不同。

(1)如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無virtual關鍵字

,基類的函式將被隱藏。

(2)如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual關

鍵字。此時,基類的函式被隱藏。

這裡的隱藏和覆蓋的含義,感覺上非常的模糊,甚至不清,並且隱藏的規則,常常令人感覺

到神出鬼沒。。。

請參看如下例項:

#includeusing namespace std;

class a

void func2(float x)

void func3(float x)

};class b:public a

void func1(int x)

void func2(int x)

void func3(float x)

};int main()

輸出結果:

b::func1(float)3.14

b::func1(float)3.14

b::func1(float)3

b::func1(int)3

a::func2(float)3.14

b::func2(int)3

a::func3(float)3.14

b::func3(float)3.14

過載 覆蓋 隱藏的區別

在csdn上經常看到這種問題 如何區別3者,從論壇中已經能夠找到完善的答案,現在自己也總結一下,加深印象,同時希望對讀者您有用。這不是乙個新的概念,在c 中乙個比較重要的概念 c語言裡面不允許 特徵就是允許函式名相同,通過指定不同的引數或者返回值來區別。這裡我們所說的過載是針對c 中類的,類中過載與...

過載 覆蓋 隱藏的區別

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

隱藏,覆蓋,過載的區別

1 先說過載,1首先兩個函式的作用域必須相同,這點很重要,基類和派生類不在乙個作用域,所以基類和派生類的函式不可能過載 2函式名相同,3引數列表 引數型別,引數的個數,引數了順序 不相同,4與返回值無關,叫過載 2 隱藏 在基類和派生類之間發生的關係,函式名相同,派生類的函式把基類的函式給隱藏了,只...