C 中的虛函式

2021-09-13 23:54:36 字數 1478 閱讀 6976

一、概述

c++ 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有「多種形態」,這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的**來實現可變的演算法。比如:模板技術,rtti技術,虛函式技術,要麼是試圖做到在編譯時決議,要麼試圖做到執行時決議。

每乙個含有虛函式的類(無論是自身還是繼承過來的,基類中是虛函式,派生類中同名且型別相同的函式也是虛函式),都至少有乙個與之對應的虛函式表,其中存放著該類所有虛函式對應的函式指標。

class base

~base()

virtual void

show()

virtual void

show

(int a)

protected:

int ma;};

class derive:public base

~derive()

void

show()

private:

int mb;

};

注意:虛函式表的確定是在編譯期間,編譯期間進行語法語義的分析之後就確定了表中的內容,在執行時物件開闢記憶體才讓 vfptr 指向表(表存放在 .rodata段)。

以上是為了便於理解,事實是:虛函式表只是虛表(virtual table)中的一部分內容。例:

針對問題(1):c++語言規定了虛函式的行為,但是它的實現留給了編譯器。

編譯器處理虛函式的方法是:給每個物件都新增了乙個隱藏成員,隱藏成員中儲存了乙個指向虛函式表的指標——大小多出四個位元組的原因。

針對問題(2):而這個虛函式表中儲存的是類物件宣告以及虛函式的位址,

base* pb = new derive(10); 基類的指標pb指向了派生類的物件

*pb本質是乙個派生類物件,通過vfptr找到派生類物件的vftable,拿到其中的rtti,列印的就是派生類物件。

早繫結(靜態繫結)

在編譯期間確定函式的呼叫(call具體的函式入口位址)

晚多型(動態繫結)

在執行期間確定函式的呼叫(call暫存器)——>實現動多型

二、虛函式的一些注意點

虛表中存放函式的入口位址——>函式能取位址

inline函式不能設定成虛函式

虛函式是通過物件記憶體布局中的 vfptr 指向的虛函式表找到的——>必須依賴物件呼叫

建構函式、static修飾的成員方法,普通函式不能設定成虛函式

析構函式、類成員函式可以設定成虛函式

C 中的虛函式 純虛函式

c 最重要的特性就是多型,而多型,就主要通過虛函式實現的。具體的實現過程是 基類中的函式定義為虛函式,派生類發生覆蓋 即函式名稱 引數列表 返回值型別完全相同 的情況下,派生類中的函式也會自動變成虛函式,不論加不加virtual關鍵字。此時,基類與子類物件中都會存在一張虛函式表 因為含有虛函式 具體...

C 中的虛函式

c 中的虛函式 virtual function 1.簡介 虛函式是c 中用於實現多型 polymorphism 的機制。核心理念就是通過基類訪問派生類定義的函式。假設我們有下面的類層次 class a class b public a 那麼,在使用的時候,我們可以 a a new b a foo ...

C 中的虛函式

c 中的虛函式 一 雖然很難找到一本不討論多型性的c 書籍或雜誌,但是,大多數這類討論使多型性和c 虛函式的使用看起來很難。我打算在這篇文章中通過從幾個方面和結合一些例子使讀者理解在c 中的虛函式實現技術。說明一點,寫這篇文章只是想和大家交流學習經驗因為本人學識淺薄,難免有一些錯誤和不足,希望大家批...