我們在學習c++過程中,關於三個詞,過載,隱藏,覆蓋,那麼他們分別做了什麼呢?且看下文詳解
1:基本概念:
過載:在同一作用域下,函式名相同,但是引數列表不同(引數個數,型別,順序)的幾個函式,構成過載關係。過載不能靠返回值型別來判斷。
示例:
class a
;
隱藏:也叫重定義,是指派生類的函式遮蔽了與其同名的基類函式(注意只要同名函式,不管引數列表是否相同,基類函式都會被隱藏)。
具體的來說,就是當如果派生類的函式和基類的函式同名,但是引數不同,此時,不管有無virtual,基類的函式被隱藏。另一點如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual關鍵字,此時,基類的函式被隱藏。所以在派生類中我們只能訪問派生類自己的成員方法,如果我們想要在派生類中訪問基類的成員方法,我們就需要加上基類的作用域(因為在派生類中,基類的成員方法也被繼承了)。
示例:
class base
;class derive:public base
;int main()
覆蓋:也叫重寫,派生類重新定義基類中相同名稱和引數的虛函式,函式特徵相同,但是具體實現不同,主要是在繼承關係中出現的。具體來說就是要構成覆蓋就得滿足基類中有virtual修飾的函式,而在派生類中有與基類中的虛函式同名且同引數列表的函式,那麼派生類中的的該函式就會將基類中的函式覆蓋,呼叫時無法呼叫基類中的函式。在子類中定義了乙個與父類虛函式完全相同的函式,那麼這個子類的函式就是重寫了父類的虛函式,此時這個子類的函式就是虛函式,即使派生類的這個函式不顯示的加上virtual修飾,編譯器也會預設為虛函式。(但是我們要知道,其覆蓋的是派生類的虛函式表中的函式位址)示例:
class base
;class derive:public base
;int main()
執行結果:
ps:基類的指標指向派生類物件,指向的是派生類中基類的部分,此時這個基類的指標呼叫在派生類中對基類中中虛函式重寫的虛函式,呼叫的是派生類的虛函式。 相反,用乙個基類的指標指向基類的物件,那麼這個基類的指標呼叫該重寫的虛函式,呼叫的是基類的虛函式,這是因為在基類中只有這乙個函式。用派生類的指標呼叫該函式也呼叫的是派生類自己的函式。這也即是覆蓋的含義,將派生類中的繼承來的函式給覆蓋掉。
補充:基類的指標能夠指向派生類,這是因為派生類由自己的一部分和繼承基類部分組成,基類的指標指向派生類其實是指向派生類中的基類部分。相反,派生類的指標無法指向基類。實際上,在虛表中還存在執行時的型別資訊,所以我們p是base*型別,但是我們解引用的*p卻是derive型別,但前提必須是有虛函式哦。
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...