C 過載 重寫 重定義 多型

2021-08-20 15:39:12 字數 890 閱讀 5413

多型是基於對抽象方法的覆蓋來實現的,用統一的對外介面來完成不同的功能。過載也是用統一的對外介面來完成不同的功能。那麼兩者有什麼區別呢?

也叫覆蓋,子類重新定義父類中有相同名稱相同引數的虛函式,主要是在繼承關係中出現的,被重寫的函式必須是virtual的,重寫函式的訪問修飾符可以不同,儘管virtual是private的,子類中重寫函式改為public,protected也可以,體現了多型。

也叫隱藏,子類重新定義父類中有相同名稱的非虛函式,引數列表可以相同可以不同,會覆蓋其父類的方法,未體現多型。

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

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

在同乙個類中,函式名相同,引數列表不同,編譯器會根據這些函式的不同引數列表,將同名的函式名稱做修飾,從而生成一些不同名稱的預處理函式,未體現多型。

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

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

C 多型 過載重寫和重定義

c 中物件導向3大概念 封裝 突破c函式的概念 用類做函式引數的時候,可以使用物件的屬性 和物件的方法 繼承 a b 復用 多型 可以使用未來 實現多型的三個條件 1 要有繼承 2 要有虛函式重寫 3 用父類指標 父類引用 指向子類物件 class parent virtual void print...

C 過載重寫重定義

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

C 過載 重寫 重定義

指函式名相同,但是它的參數列列個數或順序,型別不同。但是不能靠返回型別來判斷。1 相同的範圍 在同乙個作用域中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。5 返回值可以不同 是指派生類重新定義基類的虛函式,特徵是 1 不在同乙個作用域 分別位於派生類與基類 2 函式名字相同...