c 遠航之多型

2021-08-07 20:14:07 字數 2888 閱讀 4582

物件導向的三大特徵:繼承,封裝,多型

封裝:將資料與函式封裝到乙個類中

繼承:繼承關係是一種類間的關係(父類---子類; 基類--派生類)

多型:有了封裝與繼承之後才會有多型

多型是指相同物件收到不同訊息或不同物件收到相同訊息時產生不同的動作

在執行前,編譯階段就已確定要呼叫哪個函式,很早就把函式編譯進去

它主要通過函式和運算子過載來實現。

例如函式void go(int a){}和void go(){}這兩個函式的名字一樣,但是在編譯的時候就可以根據go()裡面有無輸入引數區分出到底執行哪個方法

使用父類指標指向子類物件時,如果乙個集合裡又有三角形又有矩形又有圓形,但是每個類裡面都有乙個單獨的計算面積的成員函式,採用虛函式的方式,可以確保找到正確的計算面積的成員函式。

例如:

父類father有個方法名字叫go()

; 子類son有個方法也叫go()

; 子類daughter有個方法也叫go()

; father *p1=new son;

father *p2=new daughter;

然後當我們執行

p1->go();

p2->go();

輸出的結果都只是父類的go;如果想實現輸出」son的go」和」daughter的go」,就需要在父類的go()方法得前面加上關鍵字virtual變成。這樣再輸入p1->go();p2->go();就可以輸出」son的go」和」daughter的go」

注意:在父類中必須加virtual 關鍵字,在各個子類中可加可不加

動態多型中存在記憶體洩漏 的問題,子類中申請記憶體後 ,delete 父類並不能釋放子類記憶體

在寫析構函式的時候,最好是在析構函式的前面加上乙個virtual的關鍵字,因為我們不知道在以後繼承的時候子類會不會在析構函式中進行銷毀指標和釋放記憶體的操作,在父類的析構函式前面加上virtual可以使子類的析構函式被呼叫,防止記憶體洩漏

釋放記憶體後還要將指標置於安全狀態即p=null。

不能修飾普通函式、靜態成員函式、內聯函式和建構函式

如何實現虛函式和虛析構函式

當例項化乙個shape物件時 除了含有資料成員 還包含乙個資料成員–虛函式表指標(佔四個記憶體單元),虛函式表在記憶體中占有一定的記憶體空間 ,在虛函式表中有相應虛函式的函式入口位址。(父類指標指向子類物件時 通過子類物件使虛函式表指標指向虛函式表

當例項化乙個circle ,circle中沒有定義與父類相同的成員函式,它繼承shape, 故它也繼承了父類的虛函式表只是儲存位址不同,但在虛函式表中的相應虛函式的函式入口位址相同。

當例項化乙個circle, circle中定義了乙個與父類相同的成員函式,則子類中成員函式的入口位址的值會覆蓋掉繼承過來的原虛函式表中父類成員函式中相應的值

理論前提:

*執行完子類的析構函式就會執行父類的析構函式。*

使用父類指標指向子類析構函式就可以實現。

純虛函式:沒有函式體,在定義的時候函式寫明=0,

例如 virtual double calcperimeter() = 0;

含有純虛函式的類就叫做抽象類

抽象類中可以有建構函式,析構函式,資料成員

抽象類無法例項化物件,當把抽象類的所有純虛函式都做了實現,抽象類的子類才可以例項化物件。

–執行時型別識別

typeid(*obj).name() ;獲取傳入的指標型別

dynamic_cast< 需要轉化的類*>(obj);轉化成相應的類

dynamic_cast注意事項:

(1)只能用於指標和引用的轉換

(2)要轉換的型別中必須包含虛函式

(3)轉換成功返回子類位址,失敗返回null

typeid注意事項:

(1)type_id返回乙個type_info物件的引用

(2)如果想通過基類的指標獲得派生類的資料型別,基類必須帶有虛函式

(3)只能獲取物件的實際型別

異常:程式執行期出現的錯誤。

異常處理:對有可能發生異常的地方做出預見性的安排。

異常處理關鍵字try…catch…和throw就是將主邏輯放在try塊裡,異常處理邏輯放在catch裡面。

基本思想:主邏輯與異常處理分離。好處看上去整齊,非常容易理解。

異常傳播方向和呼叫關係相反。

try 和catch可以是一對一也可以是一對多。

常見的異常:陣列下標越界,除數為0,記憶體不足。

多型和異常處理的聯絡:我們可以通過定義乙個異常類,把異常類定義為乙個介面類其中定義一些列印的方法,或者異常處理的方法,然後我們通過細分的子類來繼承介面類當我們丟擲這些子類的物件時都可以用父類來捕獲。throw new加子類名捕獲時用catch(父類名+&e)我們也可以通過子類物件去呼叫子類相應的虛函式。

隱藏:父類和子類出現了同名函式,父類的同名函式將進行隱藏。

十分感謝:

C 學習之多型

多型性是物件導向程式設計中的乙個重要特徵,利用多型性可以設計和實現乙個易於拓展的系統。在c 語言中,多型性是指具有不同功能的函式可以用同乙個函式名,這樣就可以用乙個函式名呼叫不同內容的函式,發出同樣的訊息被不同型別的物件接收時,導致完全不同的行為。多型性通過聯編實現。聯編是指乙個電腦程式自身彼此關聯...

初識C 之多型

多型性是將介面與實現進行分離 用形象的語言來解釋就是實現以共同的方法,但因個體差異,而採用不同的策略。1 什麼是多型 多型 polymorphism 按字面的意思就是 多種狀態 在物件導向語言中,介面的多種不同的實現方式即為多型。它是物件導向程式設計 oop 的乙個重要特徵。如果乙個語言只支援類而不...

C 特性之多型

今天學習了一下多型的有關知識。在 c primer 書中,多型特性似乎只在書的後半部分 oo 裡面提到。雖然是物件導向中很重要的乙個概念,但是並未單獨開出乙個章節來介紹。網上找了一些多型的介紹和程式,總結如下 其底層含義是大記憶體 父類 中套著許多小記憶體 子類 父類 class animal 子類...