一、覆蓋是指派生類函式覆蓋基類函式,特徵是:
(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 關鍵字可有可無。覆蓋是指派生類函式覆蓋基類函式,特徵...