分清過載 重定義和重寫

2021-09-29 00:18:26 字數 941 閱讀 8383

過載、重定義重寫,這些相似而不相同的名詞讓初學者很是困惑,以下是我所理解的三者,希望對初學者(我也是初學者:))有所幫助,若有錯誤歡迎批評指正:

一:過載(overload)(靜態聯編)

過載發生於同乙個類中(相同的作用域中),過載函式的函式名必須相同,引數必須不同,函式的返回值可以不同。函式過載從底層上看它們還是不同的函式。

二:重定義(redefining)(靜態聯編)

也稱為隱藏,在繼承關係中實現。子類重定義父類中的非虛函式,其名稱必須相同,引數可以相同(一般不相同)。重定義將遮蔽父類的所有同名函式。

三:重寫(override)(動態聯編)

也稱為覆蓋。必須通過虛函式實現,是多型的體現。同樣在繼承關係中實現,子類重寫父類中的虛函式,其函式名必須相同,引數列表必須相同,返回值可以不相同,但是必須是父子關係的指標或引用(協變)。

需要注意的細節:

1.重寫和重定義都在繼承關係中實現。其中重寫應用於虛函式,函式引數必須相同;而重定義用於非虛函式,函式引數可以相同。

於是當重定義函式引數相同時,兩者看起來極為相似,唯一的區別在於關鍵字virtual和呼叫方法:

沒有使用virtual的函式(非虛函式),為重定義,程式將根據引用或指標型別選擇方法;如果使用了virtual(虛函式),為重寫,程式將根據引用引用或指標指向的物件型別來選擇方法。

2.如果基類中的某一成員函式被過載,則派生類在重定義/重寫時,應重定義/重寫基類中此函式的所有過載版本,否則其餘版本將被隱藏,使派生類無法使用。

3.在某些書中,概念有些混淆,重寫被視為重定義的一種。

過載重寫和重定義

include using namespace std 重寫 過載 重定義 重寫發生在2個類之間 過載必須在乙個類之間 重寫分為2類 1 虛函式重寫 將發生多型 2 非虛函式重寫 重定義 class parent virtual void func virtual void func int i v...

過載重寫和重定義

過載重寫與重定義 一 過載和重寫理解 1 函式過載 必須在同乙個類中進行 子類無法過載父類的函式,父類同名函式將被名稱覆蓋 過載是在編譯期間根據引數型別和個數決定函式呼叫 2 函式重寫 必須發生在父類和子類之間 並且父類與子類中的函式必須有完全相同的原型 使用virtual宣告之後能夠產生多型 如果...

過載重寫重定義

傳智掃地僧課程學習筆記。過載發生了同乙個類中,這個很簡單,不用多說,重寫和重定義,發生了兩個類之間,有virtual關鍵字的,將發生多型,即重寫,沒有的,是重定義,說2個情況,1,若是子類呼叫父類中的函式,並且這個函式名,是名字,在子類中沒有,那麼子類物件可以直接呼叫父類的函式,2,若是這個被呼叫的...