C 虛函式的使用

2021-06-01 09:15:00 字數 1016 閱讀 3223

這兩天看了c++虛函式的相關機制,有必要記錄下自己的心得體會。

c++的虛函式機制主要依賴c++的指標和引用的靜態型別(編譯時確定的型別)和動態型別(執行時確定的型別)的不同來實現動態繫結的,也就是在執行時來確定基類指標和引用的型別,是本身基類型別還是其某個子類型別。這樣,就可以在動態時確定通過指標或者引用呼叫的是基類或者子類的虛函式。注意要實現動態繫結函式需兩個條件(1) 必須使用基類指標或者引用,c++不允許把基類賦給子類,基類指標可以指向基類及其子類物件,也必須用指標或者應用,否則其型別在編譯是就確定了。 (2) 要動態繫結的函式必須是虛函式,只有虛函式才能引發動態繫結。

下面說說c++虛函式的實現,每個含有虛函式的類在例項化時,編譯器都會為其建立乙個虛函式表,同時由vpointer指向這個虛函式表。在這個表中儲存了這個類所有的虛函式位址。而當子類繼承父類時,也會繼承這個虛函式表(乙個新的表)以及乙個新的vpointer值,如果子類對父類繼承的虛函式有修改,那麼也會將會把自己的虛函式位址改為新的虛函式位址。這樣,基類指標和引用在得到子類指標或者引用時,其基類的虛函式表指標指向的是子類的虛函式表執政,在實現動態繫結時,就能動態呼叫到子類的虛函式了。

那麼在多重繼承的時候又是怎樣呢?子類例項為每乙個父類維護乙個虛函式表指標和乙個虛函式表,即如果子類有兩個父類,那麼子類例項中就含有vpointer1,vpointer2兩個虛函式表指標。而這個虛函式表的維護與單繼承時相同。任意父類指標或者引用,都可以通過相應子類中的虛函式表指標呼叫子類的虛函式。

再說說c++引進虛函式機制的目的吧。主要是實現多型性,即使用的是基類指標實現的統一**,根據使用者傳入引數的不同,展現出不同的特性。這裡引數的不同在於是基類指標還是子類指標,使用者傳入基類指標時呼叫的是基類的虛函式,傳入子類指標時使用的是子類的虛函式,自然會表現出不同的特性了。這就是所謂的多型性以及泛型程式設計。

c 的虛函式使用

虛函式的使用 之前的 如下 include using namespace std class base 定義基類base void disp 定義成員函式 class base1 public base 定義公有派生類base1 void disp 定義同名函式 void main 結果如下 分析...

C 虛函式和虛析構函式的使用

main.cpp c test12 include using namespace std class a a virtual a void funa void funb virtual void funb void a funa void a funb class b public a b voi...

C 中虛函式的使用

c 中重要的特性 封裝 繼承和多型。其中多型體現在多個類之間的關係上,也是設計模式中常用的一種特性。多型和繼承聯絡在一起,子類繼承父類的行為同時會改變父類的行為。在這其中虛函式起了重要的作用。虛函式一般使用在什麼情況下呢?如果我們只關注程式本省的行為,同時沒有繼承關係,那麼函式是否為虛函式根本無關緊...