C 虛函式與虛表

2021-09-09 07:43:53 字數 2219 閱讀 2807

子類重新定義父類的函式重寫,但是只有父類函式宣告為虛函式的時候,才可以通過下面這種指標的方式進行呼叫,否則只能是呼叫父類的函式:

#include

class

base

virtual

void

rewrite()

};class

derived

:public base

void

rewrite

() override };

intmain()

輸出結果:

base show()

derived rewrite()

在c++11以及以後,重寫虛函式最好是新增override關鍵字,方便理解和糾錯。

虛析構函式的作用就是為了在多型的時候,能合適的呼叫子類的析構函式,給出下面**的例項:

#include

class

baseno

~baseno()

};class

derivedno

:public baseno

~derivedno()

};class

base

virtual

~base()

};class

derived

:public base

virtual

~derived()

};intmain()

輸出結果:

baseno created

derivedno created

baseno destroyed

----------------

base created

derived created

derived destroyed

base destroyed

虛表:虛表儲存了一系列的函式指標,每個類都有乙個虛表,這是類級別的。

虛指標:指向虛表的指標,每個物件都有乙個虛指標,這是物件級別的。

編譯器在下面兩個地方新增**來維護和使用虛表:

建構函式。物件在構造時,會建立乙個虛指標,指類的虛表

多型函式呼叫。當多型呼叫發生的時候,程式會先根據虛指標去檢視虛表,在虛表中會找到匹配的函式,之後進行函式呼叫,這是發生在執行期的,會損失一定的效能。

虛函式不要在建構函式中呼叫,因為建構函式中構造虛指標,此時呼叫虛函式,那麼虛函式就會向非虛函式那樣執行,所以父類和子類的虛函式都會執行一次

虛函式一般不要宣告成內聯inline的形式。在父類引用和父類指標呼叫的虛函式,不能內聯;但是子類物件的虛函式可以內聯。但是建議不要內聯。

靜態函式不能是虛函式!!!

智慧型指標不需要宣告虛析構函式也可以自動析構,但是還是建議宣告成虛析構函式!!!

#include

#include

class

base

~base()

virtual

void

show()

};class

derived

:public base

~derived()

virtual

void

show()

};intmain()

輸出:

base created

derived created

derived

derived created

base destroyed

但是,如果是如下情況,就無法使用智慧型指標判別,所以建議以後使用std::make_shared

// 只給出主函式,其餘的和上面一樣

intmain()

; sp-

>

show()

;return0;

}

輸出結果:

base created

derived created

derived

base destroyed

虛函式與虛表

虛函式作用 c 中的多型,進行動態繫結 父類指標可指向子類的物件 直到執行時才知道要具體呼叫哪個版本 哪個類定義 的函式 它是通過虛表實現的,簡單理解如下 分析 include using namespace std class base virtual void g virtual void h ...

c 虛函式與虛表深度解析

首先來看一下單繼承,編譯下面的 include include using namespace std class grandam class mother public grandam class daughter public mother int main 結果如下圖所示 第四個結果就是呼叫的...

C 虛函式 虛表和純虛函式

定義 用virtual修飾的成員函式稱為虛函式 重寫 覆蓋 當在子類中定義了乙個與父類完全相同的虛函式時,則稱這個子類的函式重寫 或覆蓋 了父類的函式 例 includeusing namespace std class person virtual void h1 int b class deri...