C++的重載、覆蓋和隱藏

C++的重載、覆蓋、隱藏這三個類似的概念,容易混淆,所以網上找了些資料,加上自己的理解,記錄在這裏。


根據《高質量C++編程指南》的分析,介紹了這三個概念的不同:


成員函數被重載的特徵:
(1)相同的範圍(在同一個類中,不同的類裏即使使用相同的函數名和參數類型也能相安無事);
(2)函數名字相同;
(3)參數不同;
(4)virtual 關鍵字可有可無。

本質是編譯後的函數簽名不同,所以編譯器能正常連接這些重載的函數。


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

本質上是通過虛函數機制,是派生類函數的地址覆蓋了虛函數表中基類該虛函數的地址。


“隱藏”是指派生類的函數屏蔽了與其同名的基類函數,規則如下:
(1)如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual
關鍵字,基類的函數將被隱藏(注意別與重載混淆)。
(2)如果派生類的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual
關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)。

本質上是繼承關係中有父子類同名函數時(虛函數的覆蓋情況除外),可見的是子類中的同名函數,父類的被隱藏,類似於c語音中局部變量和全局變量同名時,該全局變量被隱藏。

發佈了46 篇原創文章 · 獲贊 11 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章