虛函式總結篇

2022-05-02 13:18:06 字數 1232 閱讀 3926

核心:虛函式是實現多型機制的核心——通過基類訪問派生類,訪問過程在程式執行時動態確定。

使用基類指標或者引用訪問派生類;使用類指標呼叫成員函式時,普通函式由指標型別確定,而虛函式由指標指向的實際型別決定。

虛函式呼叫詳細過程:

上述說到:虛函式的訪問過程在程式執行過程中動態確定,這一過程究竟是怎麼執行的?

實際上,當乙個類中定義了乙個虛函式的時候,這個類的成員變數就會隱式的多乙個變數:虛函式表指標(vptr),這個指標指向「虛函式」表,表中的資料為函式指標(指向函式的指標,即儲存 函式位址 的變數),(題外話:普通成員函式,虛函式,虛函式表都是乙個類的所有物件公有的,成員變數和虛函式表指標(可看作隱式成員變數)是每個物件私有的),因此實際上,虛函式的實現是程式在執行時候,通過物件記憶體中的vptr找到虛函式表中的相應的函式指標(也就是函式入口位址),然後通過這個表中的函式指標去找到對應的虛函式的實現區域。當類有多個虛函式的時候,仍然只有乙個虛函式表指標vptr,但此時虛函式表中有多個函式指標。

純虛函式的理念**於:有時候我們定義乙個基類,但是我們並不想,或者並不能夠賦予其意義(比如定義動物類,生成乙個動物就顯得沒有意義),這個時候,這個基類叫做抽象類,抽象類只表徵某種意義,但不做實現,因此抽象類不能生成物件(建立例項)

因而純虛函式是定義在抽象類中的虛函式(當然了,並不是說有類分為抽象類和非抽象類,只是說明,因為乙個基類中存在了純虛函式,因此該類是抽象類)。

相當於本質上:定義純虛函式是為了在基類中實現乙個介面,用來規範子類的行為,也即表明了繼承該基類的子類必須實現該虛函式。這就是說明了:基類中定義的純虛函式,在子類中必須實現(否則如果字類也不實現,那麼子類依然是抽象類,依然無法例項化)。

對於乙個類 class a,當我們sizeof類a的乙個物件,得到的大小是所有成員變數的總的位元組數(如果有虛函式,則要加上隱式成員變數vptr的大小(4位元組或者8位元組)。

類物件中的成員變數存放的位置取決於物件本身的位置,如果物件處於函式內部,那麼這些成員變數也在棧空間,如果類物件是new出來的,則就在堆區域。等等......

虛函式小總結

當在基類中把成員函式定義為虛函式後,其派生類中定義的虛函式必須與基類的虛函式同名,引數的型別 順序 個數必須一一對應。注 析構函式除外舉例為。include iostream.h class base virtual base protected private class subclass pub...

虛函式用法總結

includeusing namespace std class class class base public class base int a,int b ival a dval b virtual void print void print int dval protected int iva...

c 虛函式,虛表相關總結

物件導向,從單一的類開始說起。class a 這個類中有兩個成員變數,都是int型別,所以這個類在記憶體中占用多大的記憶體空間呢?sizeof a 8個位元組,乙個int占用四個位元組。下圖驗證 這兩個資料在記憶體中是怎樣排列的呢?原來是這樣,我們根據debug出來的位址畫出a物件在記憶體的結構圖 ...