C 語法細微 五 多型虛函式

2021-05-12 15:43:01 字數 1178 閱讀 7597

多型(polymorphism)

多型性是指覺有不同功能的函式可以用乙個函式名 這樣就可以用乙個函式名呼叫不同內容的函式

想不同德物件傳送同一訊息 不同的物件接收到時會產生不同的行為

靜態多型性和動態多型性

靜態多型性是在程式編譯時就能決定的(函式過載 運算子過載)

動態多型性是在程式執行過程中決定的(通過虛函式(vritual function))

虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且通過基類指標或引用來訪問基類和派生類中的同名函式

!!!!:本來基類的指標是用來指向基類物件的 如果用指向派生類物件,則進行指標型別轉換將派生類物件的指標先轉換為基類的指標,所以基類指標指向的是派生類物件中的基類部分。

虛函式的使用:

(1)再基類用vritual宣告成員函式為虛函式,這樣就可以在派生類中重新定義此函式 為它賦予新的功能 並能方便的被呼叫

(2)當乙個成員函式別宣告為虛函式時 其派生類中的同名函式都自動成為虛函式 因此在派生類重新宣告該虛函式時 可以加virtual 也可以不加,習慣上每層都加上virtual 使程式更加清晰

靜態關聯和動態關聯

函式過載屬於靜態關聯(static binding)(early binding)

虛函式的多型屬於動態關聯(dynamic binding)(late binding)

只能用虛函式宣告類的成員函式 而不能將普通的函式宣告為虛函式

虛析構函式 乙個類的析構函式宣告為虛析構函式之後 所有派生此類的類的建構函式都變成虛的析構函式

虛析構函式體現在多型上(當基類的指標指向子類的例項 在delete指標的時候 呼叫的是子類的析構函式 (當然 子類的析構函式又會自動呼叫父類的析構函式))

純虛函式(pure virtual function)

純虛函式沒有函式體 只有乙個函式宣告「被初始化為0的函式」

virtual 函式型別 函式名(參數列列) = 0;

純虛函式沒有函式體 後面的 =0 也不表示函式值返回0 這是乙個宣告語句 應該有分號 不能被呼叫

抽象類(abstract class)包含純虛函式的類都是抽象類

純虛函式不能被呼叫 含有純虛函式的類是不能宣告物件的

如果乙個類包含乙個或者乙個以上的純虛函式 這個類就是抽象基類 抽象類是不能定義也沒必要定義物件的

在類的層次結構中 頂層或者最上面的幾層可以是抽象基類

五 虛函式與多型

1.多型性,就相當於乙個函式名 在基類和派生類中 多種意思表達 也可以是介面相同,實現方式不同。過載函式就是多型性的一種體現。2.虛函式,前面加關鍵字virtual的成員函式就是虛函式。這是實現多型的前提,然後用指標呼叫派生類不同實現版本 基類指標只可以訪問派生類從基類中繼承下來的成員 以乙個例子為...

C 多型,虛函式

在c 中可以用基類指標指向其派生類,如果乙個派生類繼承多個父類,那麼如何通過基類指標訪問同名的成員呢?如果基類a,基類b中都有函式fun 派生類在同時繼承a b後在記憶體中根據繼承的順序分配記憶體,例如在繼承列表中出現的是b,a,那麼b中的成員在a的之前,當我們用b的指標去訪問時候,編譯器便將指標指...

C 虛函式多型

由虛函式實現的動態多型性就是 同一類族中不同類的物件,對同一函式呼叫作出不同的響應。虛函式的使用方法是 1 在基類用virtual宣告成員函式為虛函式。這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能方便地被呼叫。在類外定義虛函式時,不必再加virtual。2 在派生類中重新定義此函式,要...