關於 多型 ,過載,覆蓋的一點 認知

2021-08-09 20:46:34 字數 3078 閱讀 5817

關於  多型 ,過載,覆蓋的一點  認知

直到今日,才發現自己對過載的認識長時間以來都是錯誤的。幸虧現在得以糾正,真的是恐怖萬分,雷人至極。一直以來,我認為過載可以發生在基類和派生類之間,例如:

1

class

a ;5

class b : public

a ;9

10void

main()

11

我一直認為當類b把類a中的test函式繼承之後,在類b中,類a的test函式和類b自己定義的test函式是過載關係(因為我覺得這兩個函式靠形參個數區分開來了),進而,我就認為第14行會呼叫類a的test函式。非常雷人。現在把過載和隱藏的注意事項總結出來,供理解有誤的人們參考:

過載:

在乙個類內,如果存在若干個同名函式,而且這些函式之間可以用形參個數或者形參型別區分開來的時候(注意不能靠函式返回型別區分),這幾個函式就互為過載函式。這時,當你通過類物件呼叫這幾個函式時,編譯器就可以通過你傳遞的實參個數或者型別,去匹配相應的函式,而不會發生歧義。這也就是過載函式的作用所在(讓你可以使用若干個同名函式)。需要注意的是:

1.過載絕對不會發生在基類和派生類之間,如上例所示。當基類和派生類中存在同名函式時,無論同名函式的形參個數或者型別是否相同,派生類中的同名函式都會將基類中的同名函式隱藏掉,因此它們是隱藏關係,而不是過載關係。關於隱藏,後邊會提到。如此以來,上例的14行在編譯時就會報錯,提示類b中沒有test(int)型別的函式。

2.在同乙個類中,過載函式之間必須依靠形參個數或者形參型別來進行區分,不能依靠返回型別。也就是說,如果同乙個類中的兩個同名函式形參個數和型別完全相同,但是返回值型別不同,這時候編譯就會報錯,因為當你通過類物件呼叫該同名函式時,編譯器會出現二義性,不知道該選擇哪個函式。記著,過載必須靠形參來區分。

3.在同乙個類中,虛函式和虛函式,虛函式和普通函式之間也可以過載,規則完全同上。虛函式下邊會提到。

隱藏:

隱藏只能出現在基類和派生類之間,而不能發生在同乙個類內(比如上述2中,只會引起編譯器出現二義性)。當基類和派生類中存在同名函式時,無論同名函式的形參個數或者型別是否相同,派生類中的同名函式都會將基類中的同名函式隱藏掉,而不會是過載關係。這時,當你通過派生類物件呼叫該同名函式時,只能訪問派生類的該函式,如果硬要訪問基類的該函式,則需要在函式名前加上類作用域,如上邊**所示。

覆蓋:

覆蓋也只能出現在基類和派生類之間,當派生類和基類中的存在同名函式,且引數個數和引數型別完全相同,並且基類中的該函式有virtual修飾(派生類中的該函式可有可無),則派生類的該函式覆蓋掉基類的該函式。該性質用來實現多型。

虛函式:

在乙個類中,用virtual關鍵字宣告的函式都是虛函式。虛函式存在的唯一目的,就是為了實現多型(動態繫結/執行時繫結)。關於多型,後面會提到。虛函式只有在基類和派生類之間才能發揮虛特性(也就是說才能發揮虛函式的真正的目的)。在同乙個類中,所有虛函式就和普通函式是一樣,使用同樣的過載規則(過載的第3點中提到過)。因此在同乙個類中可以把虛函式看作普通函式來使用(因為其虛特性發揮不出來),使用方法和注意事項與普通函式一模一樣。

多型:

多型是物件導向思想的精髓所在。說白了,就是通過基類指標或引用呼叫乙個成員函式時,直到執行階段在才能決定該成員函式是哪個派生類中定義的成員函式。有點抽象吧?沒事,先看一段**吧。

1

class

a ;5

6class b : public

a ;10

11class c : public

a ;15

16void

main()

17

我們先說什麼是多型吧,隨後再講產生多型的條件。第18行,在main函式中定義了乙個指向類a型別的指標變數a0,第21和22行分別定義了派生類b和c的物件b,c。第24行,將物件b的指標賦給a0,第25行a0.test將呼叫類b的test函式;第27行,將物件c的指標賦給a0,第28行a0.test將呼叫類c的test函式。這就是多型,有感覺了嗎?說白了,就是當基類指標變數指向了哪個派生類物件,就可以呼叫哪個派生類物件的方法。類似的,引用也可以實現多型,第19-20,30-31行所展示的。

下面總結下實現多型的條件:

哪些成員函式想要以多型的形式來執行,那麼這些函式必須:

1.在基類中將這些成員函式宣告為虛函式,並實現(必須要實現)。

2.在派生類中也宣告這些成員函式並實現(必須實現),基類和派生類的這些函式必須同名,而且其形參個數和型別,返回值型別必須與基類中的這些函式完全相同。此時,派生類中這些函式無論是否用virtual來宣告,都會被自動虛化。

3.將派生類物件賦給基類的指標變數或者引用。至此,多型實現,可用基類指標或引用呼叫派生類的方法(符合多型條件的方法,而不是普通方法)。

實現多型的這三個條件必須完全滿足,虛函式的虛特性才能發揮出來,也才能實現多型。缺少任何乙個條件,虛函式的虛特性都會被打破,無法實現多型。虛特性被打破的虛函式和普通函式是一樣的,因此說虛函式的唯一用途就是實現多型。

下面舉一些不是多型的例子:

a.基類中宣告為虛函式,派生類中也宣告為虛函式,並且也同名。但是派生類中該函式的形參型別或者形參個數和基類中的不相同。此時,多型不滿足,派生類和基類的這兩個虛函式僅僅是隱藏關係,沒有虛特性。

b.基類中宣告為虛函式,派生類中也宣告了乙個同名函式,但沒有使用virtual,並且形參型別或者形參個數和基類不相同。這時候基類中的虛函式也丟失虛特性,派生類的該函式不會被虛化,當然也就夠不成多型,這兩個函式也僅僅是隱藏關係。

c.基類中的函式不是虛函式,派生類中宣告為虛函式,它們同名,這時也夠不成多型,派生類的虛函式沒有虛特性,它們也是隱藏關係。

d.基類和派生類的兩個函式同名,都是虛函式,形參的個數和型別也都相同,但是返回值型別不同,這時編譯會報錯,因為兩個虛函式在隱藏時,返回值型別發生了衝突,因此隱藏發生錯誤。注意,如果這兩個函式不是虛函式,這不會報錯,隱藏會成功;同時,如果派生類中是虛函式,基類中不是虛函式,也不過報錯,隱藏也是成功的。這也說明,虛化並隱藏時,返回值型別一定要保持相同。

mr.doe

賬務的一點認知

賬務 支付,支付工具,支付機構,網路支付,支付流程 支付賬戶 支付機構為客戶開據的具有記錄客戶資金資訊的墊子賬簿 結算 雙方或多方對支付交易的清償 清算 結算之前對支付指令進行傳送,對賬,確認處理 對賬 乙個清算週期的交易資訊的核對 軋差 指交易夥伴活參與方之間的各種月活債務的對沖 會計科目 對會計...

關於C關鍵字volatile一點認知

近段時間在學習c語言,看到了volatile這個關鍵字,同時參考了一下網上的例子。int test volatile intptr 上面這段 在加volatile與不加產生的彙編碼如下 加volatile關鍵字的彙編碼 test lfb0 cfi startproc movl edi,4 rsp m...

初接觸jquery easyui的一點認知

jquery easyui是一種基於jquery的使用者使用者介面外掛程式集合。使用easuui你不需要寫很多 只需要編寫一些簡單的html標籤,就可以定義使用者介面。easyui大大節省了開發時間,提高了工作效率。easyui 用起來很簡單。列入對easyui裡面datagrid 外掛程式的應用,...