C 中覆蓋 過載 隱藏的區別(寫給菜鳥們)

2021-06-20 08:11:35 字數 1728 閱讀 3959

話說,我也是菜鳥,在我徹底了解了覆蓋、過載、隱藏區別的時候,我把網上大哥們冗餘的贅述加以精簡,達到我這種菜鳥級別看的動,並且不嫌煩的程度。 

下面對比一下:

一、過載

在同一可訪問區內被聲名的幾個具有不同引數列的(引數的型別、個數、順序不同)同名函式,程式會根據不同的引數列來確定具體呼叫哪個函式,這種機制叫過載,

① double calculate(double);

② double calculate(double,double);

③ double calculate(double, int);

④ double calculate(int, double);

⑤ double calculate(int);

⑥ float calculate(float);

⑦ float calculate(double);

六個同名函式calculate,①②③④⑤⑥中任兩個均構成過載,⑥和⑦也能構成過載,而①和⑦卻不能構成過載,因為①和⑦的引數相同。

二、覆蓋

函式名、引數列、返回值型別必須同父類中的相對應被覆蓋的函式嚴格一致,覆蓋函式和被覆蓋函式只有函式體(花括號中的部分)不同,當派生類物件呼叫子類中該同名函式時會自動呼叫子類中的覆蓋版本,而不是父類中的被覆蓋函式版本,這種機制就叫做覆蓋。

三、兩者間特徵上的區別

下面我們從成員函式的角度來講述過載和覆蓋的區別。

成員函式被過載的特徵有:

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

2) 函式名字相同;

3) 引數不同;

4) virtual關鍵字可有可無。

覆蓋的特徵有:

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

2) 函式名字相同;

3) 引數相同;

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

#include class base

void f(float x)

virtual void g(void)

};class derived : public base

};void main(void)

函式base::f(int)與base::f(float)相互過載,而base::g(void)被derived::g(void)覆蓋。

隱藏是指派生類的函式遮蔽了與其同名的基類函式,規則如下:

1) 如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無virtual關鍵字,基類的函式將被隱藏(注意別與過載混淆)。

2) 如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆)。

比如,在下面的程式中:

#include class base

void g(float x)

void h(float x)

};class derived : public base

void g(int x)

void h(float x)

};

通過分析可得:

1) 函式derived::f(float)覆蓋了base::f(float)。

2) 函式derived::g(int)隱藏了base::g(float),注意,不是過載。

3) 函式derived::h(float)隱藏了base::h(float),而不是覆蓋。

C 中過載 覆蓋 隱藏的區別

過載 過載特性 1 相同的範圍 2 函式名字相同 3 引數不同 4 virtual關鍵字可有可無 class a public void func int a,int b void func int a 這就是對函式進行了過載。注 對於全域性函式也是可以過載的,第乙個條件中只要範圍相同就可以。覆蓋 ...

C 中函式覆蓋 隱藏 過載區別

c 在繼承這一節涉及到函式覆蓋 隱藏 過載等,如何區別它們呢?首先函式 覆蓋的條件 1 基類函式必須是虛函式 2 發生覆蓋的兩個函式要分別位於派生類和基類中 3 函式名稱和引數列表完全相同 其次函式隱藏 主要有以下兩種情況 1 派生類的函式和基類函式完全相同 函式名和引數列表相同 只是基類的函式沒有...

C 過載 覆蓋 隱藏的區別

1 相同的範圍 在同乙個類中 2 函式名相同 3 引數不同 4 virtual關鍵字可有可無 5 與返回值型別無關 1 不同的範圍 基類和派生類中 2 函式名相同 3 引數相同 4 基類函式必須有virtual關鍵字 5 返回值型別必須相同 1 如果派生類的函式與基類的函式同名,但是引數不同。此時,...