今天看到師兄寫的證書庫代碼,看到了一個很奇怪的東東,父類里有一個不是虛函數(shù)的函數(shù),這個函數(shù)在子類中被重新寫了一遍,函數(shù)名,參數(shù)列表,返回值都一樣,就是在參數(shù)列表中的默認(rèn)值給的不太一樣。我覺得太詭異了。加上以前c++的重寫和重載之類的概念也好長時間沒弄,糊涂了。真不知道這個四不像是什么了。在網(wǎng)上翻了一些文檔,發(fā)現(xiàn)這篇寫的非常完整,而且和我想的也一樣。其實師兄的這種寫法是非常ugly的。如果出現(xiàn)這種子類中完全重新寫了父類的函數(shù),那么父類就應(yīng)該將這個函數(shù)設(shè)為virtul的才對。當(dāng)然如果沒有設(shè)置,編譯也不會出錯,這種情況下,會出現(xiàn)hide隱藏。隱藏(hide):指的是派生類的成員函數(shù)隱藏了基類函數(shù)的成員函數(shù).隱藏一詞可以這么理解:在調(diào)用一個類的成員函數(shù)的時候,編譯器會沿著類的繼承鏈逐級的向上查找函數(shù)的定義,如果找到了那么就停止查找了,所以如果一個派生類和一個基類都有同一個同名(暫且不論參數(shù)是否相同)的函數(shù),而編譯器最終選擇了在派生類中的函數(shù),那么我們就說這個派生類的成員函數(shù)"隱藏"了基類的成員函數(shù),也就是說它阻止了編譯器繼續(xù)向上查找函數(shù)的定義。而overload重載與繼承根本就沒關(guān)系,說的是同一個作用域中,相同類名,不同參數(shù)列表的現(xiàn)象。
轉(zhuǎn)載的原文見下面:
C++是一門magic的語言,很多機制復(fù)雜得讓人頭疼,但是這種迷宮競走的狀態(tài)讓人精力十足,我發(fā)誓了,不搞明白不罷休,同時也希望得到高手們的指點和幫助~
override 函數(shù)名和參數(shù)類型以及返回類型必須相同,即簽名都是一致的——或者叫相貌和衣服都是一樣的,一般用在繼承過程中。(高手判斷一下,除了實現(xiàn)細(xì)節(jié),其他的是不是什么都應(yīng)該相同?所以叫做“重寫”——《C++編程思想》上是這么翻譯的。)
overload 函數(shù)名必須相同,簽名必須不同(參數(shù)個數(shù),順序,類型),返回類型可以不同,用在同一個類中,在編譯時候確定。
以下是轉(zhuǎn)載的內(nèi)容:
override 是指在不同作用域中,多個函數(shù)原型完全一樣,而實現(xiàn)卻不同的函數(shù)。在C++中,經(jīng)常發(fā)生在類的繼承中。當(dāng)基類中的某個方法是virtual或pure virtual函數(shù)時
(當(dāng)然訪問權(quán)限必須是public或protected,因為從C++設(shè)計思想上來講private的函數(shù)不會是virtual的!!!這個請問一下,是不是這樣的??),
其子類中對該方法的重新實現(xiàn)就屬于override(重寫)。
使用時,可以通過基類的指針或者引用所指向的具體對象來確定調(diào)用的是哪個方法,從而實現(xiàn)函數(shù)的多態(tài)。
(函數(shù)的多態(tài)?C++中實現(xiàn)多態(tài)性的手段之一嗎?還有多少其他的手段??)
對于基類中的非virtual類型的成員函數(shù),若其子類中也聲明了與該函數(shù)名稱相同的函數(shù),那么基類中的該函數(shù)(也許是一系列函數(shù),如果該函數(shù)在基類中有重載的話)將被隱藏,可以通過域解析操作符來調(diào)用。不過按照C++的設(shè)計思想來說呢,基類中的非virtual類型的成員函數(shù),是不需要在子類中進行修改的,所以如果在子類中出現(xiàn)了這種隱藏的情況,說明應(yīng)該將基類中的該函數(shù)改成virtual類型的,然后就是override了!
overload則是指在相同作用域中,多個函數(shù)具有相同的名字,但參數(shù)的數(shù)目和類型各不相同(當(dāng)然相同數(shù)目和類型,如果順序不同也是可以的),因為函數(shù)重載的機制是在C++中函數(shù)的簽名與其參數(shù)有關(guān),而不像C中,只與函數(shù)名有關(guān)。
總之,override與overload的一個最大的區(qū)別就是作用域不同,以及函數(shù)原型是否相同.
override: 覆蓋是子類重寫父類的虛方法的一種形式。
overload: 重載是值允許存在重名的多個方法。而這些函數(shù)的參數(shù)列表不同(或者是參數(shù)
的個數(shù)不同、或者是參數(shù)的類型不同或者兩者都不同)。
重載(overload 與多態(tài)的概念無關(guān)) :因為是在編譯階段就確定的。
只有在與運行階段確定的才稱為面向?qū)ο蟮亩鄳B(tài)性。即override
面向?qū)ο蟮膸讉€基本概念
多態(tài):目的實現(xiàn)接口重用
繼承:實現(xiàn)代碼重用。
封裝:實現(xiàn)代碼的模塊化.
override 表示重寫,用于繼承類對基類中虛成員的實現(xiàn)
overload 表示重載,用于同一個類中同名方法不同參數(shù)(包括類型不同或個數(shù)不同)的實現(xiàn)