C 成員函式的過載,覆蓋,隱藏

2021-07-11 05:39:53 字數 1851 閱讀 3174

對於物件導向程式設計的三個特性:封裝,繼承,多型。

封裝:封裝的目的主要是為了實現源**的安全性。所以我們對其有訪問控制。c++語言使用了三個明確的關鍵字來設定類中的邊界:public,private,protected。繼承的類可以訪問protected成員,但是不能訪問私有成員。

繼承:重用介面,如果乙個類的功能不夠強大,或者我們需要在這個類的中加上另外一些功能,我們就可以使用繼承,對這個基類只能能更加或者修改。缺點:如果原來的類(基類,父類)被修改,則這個修改過的類(子類或者派生類)也會表現出這些改變。

新派生類區別與原始基類:1,簡單地向派生類新增全新的函式

2,過載函式(改變已經存在的基類函式的行為)

多型:要實現動態有覆蓋和過載兩種方式,覆蓋就是子類重寫父類虛函式的做法。過載就是函式名相同只是這些函式 的參數列不同(或許引數個數不同,或許引數型別不同,或者兩者兼有)。

早繫結指在物件申明的時候就和他的型別建立了關聯。

晚繫結是指我們的**在執行時再檢查物件是否提供了我們所需要的方法和屬性。

這些是我在網上找到的自認為最好的解釋:

多型 多型性(polymorphisn)是允許你將父物件設定成為和乙個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡單的說,就是一句話:允許將子類型別的指標賦值給父類型別的指標。 實現多型,有二種方式,覆蓋,過載。 覆蓋,是指子類重新定義父類的虛函式的做法。 過載,是指允許存在多個同名函式,而這些函式的參數列不同(或許引數個數不同,或許引數型別不同,或許兩者都不同)。 其實,過載的概念並不屬於「物件導向程式設計」,過載的實現是:編譯器根據函式不同的參數列,對同名函式的名稱做修飾,然後這些同名函式就成了不同的函式(至少對於編譯器來說是這樣的)。如,有兩個同名函式:function func(p:integer):integer;和function func(p:string):integer;。那麼編譯器做過修飾後的函式名稱可能是這樣的:int_func、str_func。對於這兩個函式的呼叫,在編譯器間就已經確定了,是靜態的(記住:是靜態)。也就是說,它們的位址在編譯期就繫結了(早繫結),因此,過載和多型無關!真正和多型相關的是「覆蓋」。當子類重新定義了父類的虛函式後,父類指標根據賦給它的不同的子類指標,動態(記住:是動態!)的呼叫屬於子類的該函式,這樣的函式呼叫在編譯期間是無法確定的(呼叫的子類的虛函式的位址無法給出)。因此,這樣的函式位址是在執行期繫結的(晚邦定)。結論就是:過載只是一種語言特性,與多型無關,與物件導向也無關!引用一句bruce eckel的話:「不要犯傻,如果它不是晚邦定,它就不是多型。」 那麼,多型的作用是什麼呢?我們知道,封裝可以隱藏實現細節,使得**模組化;繼承可以擴充套件已存在的**模組(類);它們的目的都是為了——**重用。而多型則是為了實現另乙個目的——介面重用!多型的作用,就是為了類在繼承和派生的時候,保證使用「家譜」中任一類的例項的某一屬性時的正確呼叫。

過載和覆蓋:

成員函式被過載的特徵:

(1):相同的作用域下

(2):函式名相同

(3):引數型別,順序或者數目不同

(4):virtual可有可無

成員函式被覆蓋的特徵:

(1):不同作用域(基類和其派生類)

(2):函式名相同

(3):引數型別,順序或者數目都相同

(4):virtual必須有。

令人迷惑的隱藏:

其實隱藏並不令人迷惑,只要深刻理解了過載和覆蓋,然後從過載特徵的條件一出發,覆蓋特徵的特徵4出發,即可理解隱藏規則。

1,派生類的函式與基類的函式名字相同,引數列表不同,此時無論有沒有virtual關鍵字,基類的函式在派生類中將被隱藏。

2,派生類的函式與基類的函式名字相同,引數列表也相同,但是基類函式沒有virtual關鍵字,此時,基類的函式在派生類中將被隱藏。

成員函式的過載 覆蓋 隱藏

成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無.只能靠引數而不能靠返回值型別的不同來區分過載函式.並不是兩個名字相同的函式就能構成函式過載,得具有相同的作用域.過載是指不同的函式使用相同的函式名,但是函式的引數個數或型別不同。呼...

C 成員函式的過載 覆蓋與隱藏

成員函式的過載 覆蓋 override 與隱藏很容易混淆,c 程式設計師必須要搞清楚概念,否則錯誤將防不勝防。成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。覆蓋 派生類函式覆蓋基類函式,特徵是 1 不同的範圍 分別位於派生類與...

C 成員函式的過載 覆蓋與隱藏

成員函式的過載 覆蓋 override 與隱藏很容易混淆,c 程式設計師必須要搞清楚概念,否則錯誤將防不勝防。成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。覆蓋 派生類函式覆蓋基類函式,特徵是 1 不同的範圍 分別位於派生類與...