1. 程式人生 > >8.2 成員函式的過載、覆蓋與隱藏

8.2 成員函式的過載、覆蓋與隱藏

成員函式的過載、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚概念,否則錯誤將防不勝防。

8.2.1 過載與覆蓋

成員函式被過載的特徵:
(1)相同的範圍(在同一個類中);
(2)函式名字相同;
(3)引數不同;

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

覆蓋是指派生類函式覆蓋基類函式,特徵是:
(1)不同的範圍(分別位於派生類與基類);
(2)函式名字相同;
(3)引數相同;
(4)基類函式必須有virtual 關鍵字。

示例 8-2-1 中,函式Base::f(int)與Base::f(float)相互過載,而Base::g(void)被Derived::g(void)覆蓋。


8.2.2 令人迷惑的隱藏規則


本來僅僅區別過載與覆蓋並不算困難,但是C++的隱藏規則使問題複雜性陡然增加。這裡“隱藏”是指派生類的函式遮蔽了與其同名的基類函式,規則如下:


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


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

示例程式8-2-2(a)中:
(1)函式Derived::f(float)覆蓋了Base::f(float)。
(2)函式Derived::g(int)隱藏了Base::g(float),而不是過載。
(3)函式Derived::h(float)隱藏了Base::h(float),而不是覆蓋。

據作者考察,很多C++程式設計師沒有意識到有“隱藏”這回事。由於認識不夠深刻,“隱藏”的發生可謂神出鬼沒,常常產生令人迷惑的結果。
示例 8-2-2(b)中,bp 和dp 指向同一地址,按理說執行結果應該是相同的,可事實並非這樣。


8.2.3 擺脫隱藏
隱藏規則引起了不少麻煩。示例8-2-3 程式中,語句pd->f(10)的本意是想呼叫函式Base::f(int),但是Base::f(int)不幸被Derived::f(char *)隱藏了。由於數字10不能被隱式地轉化為字串,所以在編譯時出錯。


從示例8-2-3 看來,隱藏規則似乎很愚蠢。但是隱藏規則至少有兩個存在的理由:

寫語句pd->f(10)的人可能真的想呼叫Derived::f(char *)函式,只是他誤將引數寫錯了。有了隱藏規則,編譯器就可以明確指出錯誤,這未必不是好事。否則,編譯器會靜悄悄地將錯就錯,程式設計師將很難發現這個錯誤,流下禍根。


 假如類Derived 有多個基類(多重繼承),有時搞不清楚哪些基類定義了函式f。如果沒有隱藏規則,那麼pd->f(10)可能會呼叫一個出乎意料的基類函式f。儘管隱藏規則看起來不怎麼有道理,但它的確能消滅這些意外。


示例 8-2-3 中,如果語句pd->f(10)一定要呼叫函式Base::f(int),那麼將類
Derived 修改為如下即可。
class Derived : public Base
{
public:
void f(char *str);
void f(int x) { Base::f(x); }
};

相關推薦

C++中的函式過載覆蓋隱藏

在C++語言中,函式扮演著很重要的角色,不管面向過程設計,還是基於物件設計;不管是面向物件程式設計,還是基於泛型程式設計,函式都可以隨處而見。在談論C++中的函式過載、覆蓋和隱藏之前,先回顧下函式的基礎知識。   函式的宣告包括函式的返回值型別,函式名稱,引數列表(引數的型別、引數的個數、引數的

Java中類成員函式過載覆蓋隱藏的區別

其他擴充套件連結: 過載: 成員函式被過載的特徵: 1)相同的範圍:在同一個類中 2)函式名相同,引數不同 3)virtual可有可無 覆蓋: 派生函式覆蓋基類函式 1)位於不同的範圍內(子類

8.2 成員函式過載覆蓋隱藏

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

成員函式過載覆蓋隱藏(詳細)【轉】

(轉自:https://blog.csdn.net/weixin_42205987/article/details/81569744) 成員函式的過載、覆蓋與隱藏 成員函式的過載(overload)、覆蓋/重寫(override)與隱藏/重定義(hide)很容易混淆,C++程式設計師必須要搞

C++中成員函式過載覆蓋隱藏

成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同; (4)virtual關鍵字可有可無。 覆蓋是指派生類函式覆蓋基類函式,特徵是: (1)不同的範圍(分別位於派生類與基類); (2)函式名字相同; (3)引數相同; (4)基類函

轉載:成員函式過載覆蓋隱藏

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

成員函式過載覆蓋隱藏(詳細)

成員函式的過載、覆蓋與隱藏 成員函式的過載、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚概念,否則錯誤將防不勝防。 過載與覆蓋 成員函式被過載的特徵: (1)相同的範圍(在同一個類中) (2)函式名字相同

c++(成員函式的)過載覆蓋隱藏

覆蓋,和隱藏是很不一樣的兩個概念,要重點區分。 過載(overload):同名函式變數,但屬於不同的函式型別。發生在同一個作用域內,即在同一個類中。如果跨類,在父類、子類當中存在同名的函式變數(即便是不同的函式型別),如果是 virtual 性質的,就是過載(也叫繼承,

c++ 成員函式過載覆蓋隱藏

成員函式的過載、覆蓋與隱藏 成員函式的過載、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚 概念,否則錯誤將防不勝防。 8.2.1 過載與覆蓋 成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同;

C++成員函式過載覆蓋隱藏

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

C++類型別成員函式過載覆蓋隱藏

類層次中的同名成員函式,有3種關係:過載overload,覆蓋override和隱藏oversee,hide。 1.成員過載 只有在同一個類中定義的同名成員函式才存在過載關係,主要特點是函式的引數和數目不同,但不能是引數的個數和型別均相同,僅僅依靠返回值的不同來區分函式,和

成員函式過載覆蓋隱藏

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

C++父類子類關係以及函式過載覆蓋隱藏規則

今天去HTC面試,筆試考了邏輯、c語言、c++語言幾個部分,C/C++考的全是基本語法,沒有考演算法。C語言部分做的還不錯,C++部分卻做的那麼多不確定,其中大部分是C++父子類之間關係以及函式過載、覆蓋以及隱藏規則。 在C++語言中,虛擬函式是非常重要的概念,虛擬函式是

(1) C++:過載覆蓋隱藏

  C++之中的過載、覆蓋、隱藏   過載 覆蓋 過載與覆蓋的區別 相關程式碼 隱藏   過載 過載是指函式不同的引數表,對同名函式的名稱做修飾,然後這些同名函式就成了不同的函式。在同一可訪問區域內被宣告的幾

C++語言特性:建構函式,解構函式,虛擬函式,行內函數,靜態成員函式,過載覆蓋隱藏

C++中class預設屬性為private, struct預設屬性為public 建構函式:        1.初始化物件成員;        2.建立類物件;        由於虛擬函式是建立在物件的基礎上的,因此建構函式不能宣告為虛擬函式;虛擬函式是在執行的時候才識別,

成員函式過載覆蓋隱藏(遮蔽)的區別

a.成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有可無。 b.覆蓋是指派生類函式覆蓋基類函式,特徵是: (1)不同的範圍(分別位於派生類與基類); (2)函式名字相同;

成員函式過載覆蓋隱藏區別?

#include <iostream> #include <complex> using namespace std; class Base { public:     virtual void a(int x)    {    cout << "Base::a(int)"

C++中類成員函式過載覆蓋隱藏的區別,超清楚!

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

成員函式過載覆蓋隱藏區別 (C++)

      這是本人第一次寫部落格,主要是想記錄自己的學習過程、心得體會,一是可以方便以後回顧相關知識,二是可以與大家相互學習交流。       關於C++中類成員函式的過載、覆蓋和隱藏區別,第一次看到這個問題是在準備找工作的時候在牛客網中(http://www.nowcoder.com/questionT

成員函式過載覆蓋隱藏的區別

參考:https://www.nowcoder.com/questionTerminal/266d3a6d4f1b436aabf1eff3156fed951.函式過載的特徵:(1)必須在同一個類中(相同範圍)(2)函式名字必須相同但是函式型別可以不相同(3)引數類表可以不同(