c 函式過載和函式覆蓋的區別

2021-07-13 03:34:41 字數 2585 閱讀 4837

**:
「overload」翻譯過來就是:超載,過載,過載,超出標準負荷;「override」翻譯過來是:重置,覆蓋,使原來的失去效果。

先來說說過載的含義,在日常生活中我們經常要清洗一些東西,比如洗車、洗衣服。儘管我們說話的時候並沒有明確地說用

洗車的方式來洗車,或者用洗衣服的方式來洗一件衣服,但是誰也不會用洗衣服的方式來洗一輛車,否則等洗完時車早就散架了。

我們並不要那麼明確地指出來就心知肚明,這就有過載的意思了。

在同一可訪問區內被聲名的幾個具有不同引數列的(引數的型別、個數、順序不同)同名函式,程式會根據不同的引數列來確定

具體呼叫哪個函式,這種機制叫過載,過載不關心函式的返回值型別。

這裡,「過載」的「重」的意思不同於「輕重」的「重」,它是「重複」、「重疊」的意思。例如在同一可訪問區內有:

① 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),而不是覆蓋。

看完前面的示例,可能大家還沒明白隱藏與覆蓋到底有什麼區別,因為我們前面都是講的表面現象,

怎樣的實現方式,屬於什麼情況。下面我們就要分析覆蓋與隱藏在應用中到底有什麼不同之處。

在下面的程式中bp和dp指向同一位址,按理說執行結果應該是相同的,可事實並非如此。

void main(void)

請大家注意,f()函式屬於覆蓋,而g()與h()屬於隱藏。從上面的執行結果,我們可以注意到在覆蓋中,

用基類指標和派生類指標呼叫函式f()時,系統都是執行的派生類函式f(),而非基類的f(),

這樣實際上就是完成的「介面」功能。而在隱藏方式中,用基類指標和派生類指標呼叫函式f()時,

系統會進行區分,基類指標呼叫時,系統執行基類的f(),而派生類指標呼叫時,系統「隱藏」了基類的f(),

執行派生類的f(),這也就是「隱藏」的由來。

再使用一段**說明:

#include

using namespace std;

class parent

void foo1()

};class son: public parent

C 函式過載和函式覆蓋的區別

overload 翻譯過來就是 超載,過載,過載,超出標準負荷 override 翻譯過來是 重置,覆蓋,使原來的失去效果。先來說說過載的含義,在日常生活中我們經常要清洗一些東西,比如洗車 洗衣服。儘管我們說話的時候並沒有明確地說用 洗車的方式來洗車,或者用洗衣服的方式來洗一件衣服,但是誰也不會用洗...

C 函式覆蓋,過載,隱藏的區別

c 中函式的覆蓋,過載和隱藏之間的關係是很令人頭疼的,又是不太容易區分的,現在此總結一下。範圍的不同 函式的過載發生在類內部,而函式的覆蓋,也叫函式重寫,及函式隱藏發生在類間。也就是說,在同乙個類中只會發生函式的過載,而在子類與父類間會發生覆蓋和隱藏。宣告方式的不同 在同乙個類中,如果宣告多個函式,...

函式過載和覆蓋

目錄 一 函式過載 重定義 1 函式過載 2 函式過載在c語言中為啥不能共存 3 c 中函式過載 4 函式過載的特點 過載的三要素 二 覆蓋 1 覆蓋函式 2 覆蓋的特徵 三 過載和覆蓋的區別 四 程式示例 過載是指函式不同的參數列,對同名函式的名稱做修飾,然後這些同名函式就成了不同的函式 同名,引...