C 覆蓋過載隱藏問題

2021-07-09 10:59:50 字數 2474 閱讀 6578

「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(),這也就是「隱藏」的由來。

c 過載 覆蓋 隱藏

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

c 過載 覆蓋 隱藏

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

c 過載 覆蓋 隱藏

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