函式過載與函式重寫 有的書也叫做「覆蓋」)的區別

2021-09-28 18:38:17 字數 590 閱讀 9517

常考的題目。從定義上來說:

過載:是指允許存在多個同名函式,而這些函式的參數列不同(或許引數個數不同,或許引數型別不同,或許兩者都不同)。

重寫:是指子類重新定義復類虛函式的方法。

從實現原理上來說:

過載:編譯器根據函式不同的參數列,對同名函式的名稱做修飾,然後這些同名函式就成了不同的函式(至少對於編譯器來說是這樣的)。如,有兩個同名函式:function func(p:integer):integer;和function func(p:string):integer;。那麼編譯器做過修飾後的函式名稱可能是這樣的:int_func、str_func。對於這兩個函式的呼叫,在編譯器間就已經確定了,是靜態的。也就是說,它們的位址在編譯期就繫結了(早繫結),因此,過載和多型無關!

重寫:和多型真正相關。當子類重新定義了父類的虛函式後,父類指標根據賦給它的不同的子類指標,動態的呼叫屬於子類的該函式,這樣的函式呼叫在編譯期間是無法確定的(呼叫的子類的虛函式的位址無法給出)。因此,這樣的函式位址是在執行期繫結的(晚繫結)。

C 中函式重寫 過載與重寫的區別

過載 靜態多型 1 同一作用域 2 子類無法過載父類函式,父類同名函式將被隱藏 3 過載是在編譯期間根據引數型別和個數決定的 重寫 動態多型 1 在子類中定義與父類中原型相同的函式 2 函式重寫只發生在父類與子類之間 3 使用virtual關鍵字申明後能產生多型 4 執行期間根據具體物件型別決定呼叫...

C 函式過載 重定義與重寫

在同乙個作用域中,兩個函式的函式名相同,引數個數,引數型別,引數順序至少有乙個不同,函式返回值的型別可以相同,也可以不相同。c 中支援函式過載是因為c 中會對函式進行名字修飾。name mangling是一種在編譯過程中,將函式 變數的名稱重新改編的機制,簡單來說就是編譯器為了區分各個函式,將函式通...

C 中函式的過載與重寫

c 允許在同一範圍中宣告幾個功能類似的同名函式,但是這些同名函式的形式引數 指引數的個數 型別或者順序 必須不同,也就是說用同乙個函式完成不同的功能。這就是過載函式。過載函式常用來實現功能類似而所處理的資料型別不同的問題。不能只有函式返回值型別不同。兩個過載函式必須在下列乙個或兩個方面有所區別 1 ...