C 總結1 覆蓋與隱藏

2021-04-09 08:25:53 字數 1301 閱讀 4857

一、覆蓋是指派生類函式覆蓋基類函式,特徵是:

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

(2)函式名字相同;

(3)引數相同;

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

有點:安全多了, 一切盡在掌握。

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

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

基類的函式將被隱藏(注意別與過載混淆)。

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

弊端:基類指派生類指標除了虛函式一切都是調自己的包括隱藏的。派生類指標呼叫的隱藏函式,基類函式在也不出現。採用隱藏,弊端就是基類指標呼叫同名函式看似是範化,但實為呼叫自身。

派生子類覆寫了父類的乙個方法,而該父類方法的引數發生了改變,編譯器在編譯過程中並沒有發現這個問題。在程式執行的時候,則出現了死迴圈,並且沒有任何的錯誤提示。這個bug著實讓人很迷惑,也耗費了同事很多的時間,最後才發現是由於父類方法發生了改變,而子類中的覆寫方法又沒有更新造成的。隱藏的方法,可能在意料之外被呼叫,得到非預期的結果 ..

隱藏的作用:

class b

class d

int main()

希望它呼叫哪個函式?如果不使用隱蔽的話,它會呼叫基類的foo(double),而實施上你可能希望呼叫的是派生類的foo(int)。所以,c++乾脆使用名字隱蔽,清晰一些。

總結示例:

#include

class base

void g(float x)

void h(float x)

};class derived : public base

void g(int x)

void h(float x)

};void main(void)

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

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

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

隱藏的發生可謂神出鬼沒,常常產生令人迷惑的結果

隱藏容易造成意外的過載,無意間又多出了個函式,而且還可能被呼叫。

所以不推薦使用隱藏,最好使用覆蓋

///編者注:

是我做菜鳥的時候,一點點總結和問高手得來的,所以有很多是拼湊的,有些生硬

貴在互相學習。感謝那些曾經幫助過我的人!

c 過載 覆蓋 隱藏 1

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

c 覆蓋 過載與隱藏

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

隱藏與覆蓋

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