C 的虛函式

2021-09-09 01:18:59 字數 910 閱讀 1009

虛在**

虛函式成就了多型,意思就是指向基類的指標在操作它的多型類物件時,會根據不同的類例項,呼叫其相應的函式。

繼承/指標/例項

怎麼實現的呢?

編譯器針對虛函式採用「vtable」機制。編譯器發現乙個類中有被宣告為virtual的函式,就會為其搞乙個虛函式表,也就是vtable。vtable實際上是乙個函式指標的陣列,每個虛函式占用這個陣列的乙個slot。乙個類只有乙個vtable,不管它有多少個例項。one class,one vtable . 派生類有自己的vtable,但是派生類的vtable與基類的vtable有相同的函式排列順序,同名的虛函式被放在兩個陣列的相同位置上。在建立類例項的時候,編譯器還會在每個例項的記憶體布局中增加乙個vptr欄位,該欄位指向本類的vtable。通過這些手段,編譯器在看到乙個基類的虛函式呼叫的時候,就會將這個呼叫指向對應例項所屬的那個類的虛函式。

示例說明?

//基類,virtual關鍵字處理

class a{

virtual void foo(){

print("from a\n");

//子類,方法名前virtual可加可不加,根據是否要繼承b實現b方法的多型需求而定

class b:class a{

void foo(){

print("from b\n")

//例項化並呼叫

void call(){

a *a1 = new a();

a *a2 = new b();

a1->foo();

a2->foo();

輸出結果是——

from a

from b

C 虛函式 純虛函式

1 基本概念 虛函式是在基類中使用關鍵字virtual宣告的函式。在派生類中重新定義基類中定義的虛函式時,會告訴編譯器不要靜態鏈結到該函式。我們想要的是在程式中任意點可以根據所呼叫的物件型別來選擇呼叫的函式,這種操作被稱為動態鏈結,或後期繫結。您可能想要在基類中定義虛函式,以便在派生類中重新定義該函...

C 虛函式 純虛函式

1.析構函式是否應為虛函式問題?2.成員函式的虛函式問題?3.析構函式是否可以為純虛函式問題?說明 僅在使用父類指標指向子類物件時有區別 當析構函式非虛函式時,使用父類指標指向子類物件,在析構時將不會呼叫子類析構函式 當析構函式是虛函式時,使用分類指標指向子類物件,在析構時會呼叫子類析構函式,且呼叫...

C 虛函式 純虛函式

include qdebug class animal void animal animal 即要實現基類animal的animal函式 假如在dog子類中沒有實現animal 函式,則會呼叫基類的animal 函式。即列印 what is the animal 假如在dog子類中實現了animal...