重寫 覆蓋 過載 多型

2021-08-03 05:26:30 字數 1565 閱讀 2158

《這篇部落格很亂,關於過載、隱藏、覆蓋的相關知識,看另一篇部落格》

參考部落格

其實多型和過載不是乙個層次上的問題,重寫(覆蓋)、過載、隱藏常放在一起討論,多型是重寫(覆蓋)下的一種特殊情況,即基類的函式被virtual修飾了。

1、多型和過載的區別

多型是基於對抽象方法的覆蓋來實現的,用統一的對外介面來完成不同的功能。過載也是用統一的對外介面,來完成不同的功能。

那麼兩者有什麼區別呢?

過載,是指允許存在多個同名方法,而這些方法的引數不同。過載的實現是:編譯器根據方法不同的參數列,對同名方法的名稱做修飾。對於編譯器而言,這些同名方法就成了不同的方法。它們的呼叫位址在編譯期就繫結了。

多型:是指子類重新定義父類的虛方法(virtual,abstract)。當子類重新定義了父類的虛方法後,父類根據賦給它的不同的子類,動態呼叫屬於子類的該方法,這樣的方法呼叫在編譯期間是無法確定的。

不難看出,兩者的區別在於編譯器何時去尋找所要呼叫的具體方法,對於過載而言,在方法呼叫之前,編譯器就已經確定了所要呼叫的方法,這稱為「早繫結」或「靜態繫結」;而對於多型,只有等到方法呼叫的那一刻,編譯器才會確定所要呼叫的具體方法,這稱為「晚繫結」或「動態繫結」。

2、重寫(覆蓋)、過載、多型

override->重寫(=覆蓋)、overload->過載、polymorphism -> 多型

override是重寫(覆蓋)了乙個方法,以實現不同的功能。一般是用於子類在繼承父類時,重寫(重新實現)父類中的方法。

重寫(覆蓋)的規則:

1、重寫方法的引數列表必須完全與被重寫的方法的相同,否則不能稱其為重寫而是過載。

2、重寫方法的訪問修飾符一定要大於被重寫方法的訪問修飾符(public>protected>default>private)。

3、重寫的方法的返回值必須和被重寫的方法的返回一致。

4、重寫的方法所丟擲的異常必須和被重寫方法的所丟擲的異常一致,或者是其子類。

5、被重寫的方法不能為private,否則在其子類中只是新定義了乙個方法,並沒有對其進行重寫。

6、靜態方法不能被重寫為非靜態的方法(會編譯出錯)。

overload是過載,一般是用於在乙個類內實現若干過載的方法,這些方法的名稱相同而引數形式不同。

過載的規則:

1、在使用過載時只能通過相同的方法名、不同的引數形式實現。不同的引數型別可以是不同的引數型別,不同的引數個數,不同的引數順序(引數型別必須不一樣)。

2、不能通過訪問許可權、返回型別、丟擲的異常進行過載。

3、方法的異常型別和數目不會對過載造成影響。

多型的概念比較複雜,有多種意義的多型,乙個有趣但不嚴謹的說法是:繼承是子類使用父類的方法,而多型則是父類使用子類的方法。一般,我們使用多型是為了避免在父類裡大量過載引起**臃腫且難於維護。

重寫 覆蓋 過載 多型

override 重寫 覆蓋 overload 過載 polymorphism 多型override是重寫 覆蓋 了乙個方法,以實現不同的功能。一般是用於子類在繼承父類時,重寫 重新實現 父類中的方法。重寫 覆蓋 的規則 1 重寫方法的引數列表必須完全與被重寫的方法的相同,否則不能稱其為重寫而是過載...

c 多型 重寫 覆蓋 隱藏 過載

多型 重寫 覆蓋 c 中多型是指同乙個操作作用於不同的物件可以有不同的解釋,產生不同的執行結果,多型是通過虛函式實現的,在派生類中重寫基類的虛函式。呼叫方法 宣告基類的指標,利用該指標指向派生類物件,就可以用該指標呼叫派生類中重寫後的虛函式。這樣就可以根據指向的派生類不同,而實現不同的方法。多型的特...

重寫 覆蓋 過載 多型的區別

override 重寫 覆蓋 overload 過載 polymorphism 多型 override是重寫 覆蓋 了乙個方法,以實現不同的功能。一般是用於子類在繼承父類時,重寫 重新實現 父類中的方法。重寫 覆蓋 的規則 1 重寫方法的引數列表必須完全與被重寫的方法的相同,否則不能稱其為重寫而是過...