菜鳥學C 分清楚C 中過載 重寫和重定義

2022-03-06 14:09:08 字數 1492 閱讀 2686

1、背景

在c++裡有必要弄清楚他們三者的不同。

1.1 參考資料

2、三者的不同詳細

過載(overload):是函式名相同,引數列表不同,override只是在類的內部存在。

重寫(override),也叫覆蓋。子類重新定義父類中有相同名稱和引數的虛函式(virtual)。在繼承關係之間。c++利用虛函式實現多型。

重寫的特點: 

1 被重寫的函式不能是static的。必須是virtual的

2 重寫函式必須有相同的型別,名稱和引數列表

3 重寫函式的訪問修飾符可以不同。儘管父類的virtual方法是private的,派生類中重寫改寫為public,protected也是可以的。

這是因為被virtual修飾的成員函式,無論他們是private/protect/public的,都會被統一放置到虛函式表中。對父類進行派生時,子類會繼承到擁有相同偏移位址的虛函式標(相同偏移位址指的是各虛函式先谷底與vptr指標的偏移),因此就允許子類對這些虛函式進行重寫

重定義(redefining),也叫隱藏。子類重新定義父類有相同名稱的非虛函式(引數列表可以不同)。

子類若有和父類相同的函式,那麼,這個類將會隱藏其父類的方法。除非你在呼叫的時候,強制轉換成父類型別。在子類和父類之間嘗試做類似過載的呼叫時不能成功的。

執行結果:

子類重定義了父類的say_no方法,雖然參數列列不同,但子類物件不能直接呼叫被重定義的父類方法。

執行結果

這就告訴我們在子類和父類之間搞類似過載的重定義,父類的public 同名函式被隱藏。則告訴我們對於父類過載函式,子類不能再搞過載,不然父類的這些過載成員函式就被隱藏。原因就是實際上是重定義redefining。

綜上所述,總結如下:

1 成員函式過載特徵:

a 相同的範圍(在同乙個類中)

b 函式名字相同

c 引數不同

d virtual關鍵字可有可無

2 重寫(覆蓋)是指派生類函式覆蓋基類函式,特徵是:

a 不同的範圍,分別位於基類和派生類中

b 函式的名字相同

c 引數相同

d 基類函式必須有virtual關鍵字

3 重定義(隱藏)是指派生類的函式遮蔽了與其同名的基類函式,規則如下:

a 如果派生類的函式和基類的函式同名,但是引數不同,此時,不管有無virtual,基類的函式被隱藏。

b 如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有vitual關鍵字,此時,基類的函式被隱藏。否則就是重寫了。

特別要區分虛函式的重寫和重定義。

C 中過載 重寫 重定義

過載 1 作用域相同。2 函式名相同,引數列表不同。3 與返回值無關。例 同乙個類的建構函式和拷貝建構函式構成過載。class a a const a a 重寫 覆蓋 1 不在同一作用域 分別為基類和派生類 2 函式名相同,引數列表相同,返回值相同。3 基類成員函式必須有virtual關鍵字修飾。4...

C 過載 重寫和重定義

函式過載 overload 函式過載是指在乙個類中宣告多個名稱相同但引數列表不同的函式,這些的引數可能個數或順序,型別不同,但是不能靠返回型別來判斷。特徵是 1 相同的範圍 在同乙個作用域中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無 注 函式過載與有無virtual修飾無關...

C 過載重寫重定義

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