關於C++中override與overload的總結和疑問
override 函式名和引數型別以及返回型別必須相同,即簽名都是一致的——或者叫相貌和衣服都是一樣的,一般用在繼承過程中。(高手判斷一下,除了實現細節,其他的是不是什麼都應該相同?所以叫做“重寫”——《C++程式設計思想》上是這麼翻譯的。)
overload 函式名必須相同,簽名必須不同(引數個數,順序,型別),返回型別可以不同,用在同一個類中,在編譯時候確定。
以下是轉載的內容:
override 是指在不同作用域中,多個函式原型完全一樣,而實現卻不同的函式。在C++中,經常發生在類的繼承中。當基類中的某個方法是virtual或pure virtual函式時
(當然訪問許可權必須是public或protected,因為從C++設計思想上來講private的函式不會是virtual的!!!這個請問一下,是不是這樣的??),
其子類中對該方法的重新實現就屬於override(重寫)。
使用時,可以通過基類的指標或者引用所指向的具體物件來確定呼叫的是哪個方法,從而實現函式的多型。
(函式的多型?C++中實現多型性的手段之一嗎?還有多少其他的手段??)
對於基類中的非virtual型別的成員函式,若其子類中也聲明瞭與該函式名稱相同的函式,那麼基類中的該函式(也許是一系列函式,如果該函式在基類中有過載的話)將被隱藏,可以通過域解析操作符來呼叫。不過按照C++的設計思想來說呢,基類中的非virtual型別的成員函式,是不需要在子類中進行修改的,所以如果在子類中出現了這種隱藏的情況,說明應該將基類中的該函式改成virtual型別的,然後就是override了!
overload則是指在相同作用域中,多個函式具有相同的名字,但引數的數目和型別各不相同(當然相同數目和型別,如果順序不同也是可以的),因為函式過載的機制是在C++中函式的簽名與其引數有關,而不像C中,只與函式名有關。
總之,override與overload的一個最大的區別就是作用域不同,以及函式原型是否相同.
override: 覆蓋是子類重寫父類的虛方法的一種形式。
overload: 過載是值允許存在重名的多個方法。而這些函式的引數列表不同(或者是引數
的個數不同、或者是引數的型別不同或者兩者都不同)。
過載(overload 與多型的概念無關) :因為是在編譯階段就確定的。
只有在與執行階段確定的才稱為面向物件的多型性。即override
面向物件的幾個基本概念
多型:目的實現介面重用
繼承:實現程式碼重用。
封裝:實現程式碼的模組化.
override 表示重寫,用於繼承類對基類中虛成員的實現
overload 表示過載,用於同一個類中同名方法不同引數(包括型別不同或個數不同)的實現
好像好羅嗦啊!請高手指教~
最後,還想請您總結一下 介面與實現 的微妙關係~最好是打比方~