C 學習 多型性

2021-10-11 07:44:37 字數 2430 閱讀 6048

多型性是指為乙個函式名關連多種含義的能力。具體來說,多型性指的是通過名為**「晚期繫結」**的一種特殊機制來為函式名稱關聯多個含義。多型性是物件導向程式設計的核心概念之一。

這裡先舉乙個例子來,定義乙個基類figure類,基類中有個成員函式center,作用是將乙個圖形放在介面中心,具體實現是先呼叫刪除函式,再在中心位置畫圖形。然而figure類中含有許多派生類,比如說circle類、rectangle類,派生類對從基類中繼承的draw函式進行重定義。但是為派生類呼叫center函式時,center函式內呼叫的函式還是基類的draw函式(可能還是乙個空的函式)。而這時候將基類中的draw設為虛函式,即可解決問題。

虛函式是某種意義上能在定義前使用的函式。用保留字「virtual」將函式宣告為虛函式,相當於告訴編譯器:「我不知道這個函式如何實現。等它在程式中使用時,再從物件例項(派生類)中獲得他的實現。」這種技術稱為晚期繫結動態繫結。而虛函式是一種實現晚期繫結的一種具體的手段。

在c++中使用順利使用虛函式,需要掌握如下所示的技術細節:

1、虛函式只需在基類中用virtual宣告一次即可,在派生類中會自動新增virtual,但為了程式清晰,最好手動加上關鍵字virtual。

2、關鍵字virtual在函式宣告中新增,不能在函式定義中新增。

3、只能用關鍵字virtual宣告虛函式。

4、編譯器和執行環境要為虛函式做更多的工作,故不要無故將基類成員函式設為虛函式。

虛函式在派生類中發生改變時,我們稱函式定義被重寫。之前說過重定義的概念。二者都是在派生類中修改函式定義,只是重寫更新有關類(ps:主要是基類)中所有同名函式的實現,重定義只是更改派生類函式中的定義。

多型性是指借助晚期繫結技術,為乙個函式名關聯多種含義的能力。故,多型性,虛函式,晚期繫結表述的是一類的概念。

c++是強型別語言,即型別會得到檢查,型別不匹配(函式呼叫時)會生成錯誤資訊,但在某些時候,c++會執行自動型別轉換,使表面上能夠將一種型別的值賦給另一種型別的值。比如說可以將部分int型別的值賦給char型別的值。將這種c++自動執行型別轉換稱為執行一次「強制」。

但是,強制型別檢查碰上了具有繼承關係的類時,就會產生衝突。比如說類b由類a繼承,那麼可以類b型別的值賦給類a型別的值,會產生「切割問題」,但不能將類a(基類)型別的物件賦給b類型別的值。

下面列舉乙個具體的例子吧!

#include

#include

using

namespace std;

class

pet string name;};

class

dog:

public pet

string breed;};

intmain()

這裡只會列印出名字tim,因為在a=b的過程中b的breed變數被切割丟失了。解決方法是使用動態變數。

int

main()

a是基類的指標,但是可以指向其派生類的記憶體(a=b),並且但是不能呼叫派生類獨有的成員函式和變數。但是由於這裡的print函式是虛函式,在繼承類中完成了重寫,故a->print();會檢查pet和dog的virtual表,判斷a指向的是dog型別物件的記憶體,會呼叫dog::print();函式。

有點難理解,但記住下面兩條原則即可:

1、 如果a是基類型別的指標,b是派生類型別的指標,則下面的指標賦值時允許的,並且不會產生切割問題。

a=b;

2、雖然a指向的動態記憶體沒有丟,但是只能訪問屬於a類(基類)的資料。若想訪問b類附加的成員變數,需要使用新增了virtual的成員函式(也在基類的公共部分裡)訪問。

另外,如果還有任何尚未實現的virtual成員函式,編譯就會失敗!(ps:呃呃好像所有的函式都這樣,只宣告,不實現,都會報錯,寫個空的實現即可)

一旦討論到了析構函式,就會牽扯到動態記憶體的問題。這裡還是以上面兩個類pet類和dog類為例;假設pet類和dog類中的變數都是指標型別,在構造時都會指向一塊動態記憶體。

在上面例子中,如果想要釋放b指標指向的記憶體,只使用

delete a;

會只呼叫pet類型別的析構函式,只會釋放name的動態記憶體,而breed的記憶體不會釋放。

但是,如果將pet類的析構函式設為虛函式,那麼在執行

delete a;

時,會先檢查virtual表,判斷a指向的是dog型別物件的記憶體,會呼叫dog型別的析構函式。那麼這樣記憶體就會完全釋放。

所以,在使用繼承時,將基類的析構函式設為virtual即可解決問題!!!

C 學習之多型性

類的幾個重要特性之一多型性,有著廣泛的用途。類的多型性包括 編譯時多型和執行時多型。編譯時多型表現為乙個同名的方法會根據引數型別 個數和位置的不同有不同執行效果。通過方法過載來實現。顧名思義,它由編譯器根據呼叫引數的不同,選擇相應的函式。執行時多型通過虛方法實現。表現為 相同的引數,仍會執行不同的函...

C 的多型性

c 的多型性 1.多型性的概念 多型性是指用乙個名字定義不同的函式,這函式執行不同但又類似的操作,從而實現 乙個介面,多種方法 多型性的實現與靜態聯編 動態聯編有關。靜態聯編支援的多型性稱為編譯時的多型性,也稱靜態多型性,它是通過函式過載和運算子過載實現的。動態聯編支援的多型性稱為執行時的多型性,也...

有關C 多型性

c 多型性是通過虛函式來實現的,虛函式允許子類重新定義成員函式,而子類重新定義父類的做法稱為覆蓋 override 或者稱為重寫。這裡我覺得要補充,重寫的話可以有兩種,直接重寫成員函式和重寫虛函式,只有重寫了虛函式的才能算作是體現了c 多型性 而過載則是允許有多個同名的函式,而這些函式的引數列表不同...