C 多型實現及原理

2021-07-09 11:38:02 字數 1583 閱讀 4807

#include #include using namespace std;

class person

~men()

~women()

執行結果:

men:1peter

women:2lily

delete men

delete person

delete women

delete person

繼承機制中,子類訪問父類成員方式

不管什麼繼承,父類的private成員始終為父類私有

public繼承:父類的public和protected成員在子類中訪問屬性不變

private繼承:父類的public和protected成員在子類中變成private

protected繼承:父類public和protected成員在子類中變成protected

虛函式實現原理

多型簡單來說就是:父類的指標(或者引用)指向其子類的例項,然後通過父類的指標(或者引用)呼叫實際子類的成員函式。

在每個包含有虛函式的類的物件的

最前面(是指這個物件物件記憶體布局的最前面)都有乙個稱之為

虛函式指標(vptr)的東西指向虛函式表(vtbl)

,這個虛函式表(這裡僅討論最簡單的單一繼承的情況,若果是多重繼承,可能存在多個虛函式表)裡面存放了這個類裡面

所有虛函式的指標

,當我們要

呼叫裡面的函式時通過查詢這個虛函式表來找到對應的虛函式

,這就是虛函式的實現原理。

注意一點,如果基類已經插入了vptr, 則派生類將繼承和重用該vptr。vptr必須隨著物件型別的變化而不斷地改變它的指向,以保證其值和當前物件的實際型別是一致的。這就是c++多型性實現的原理。

需要注意的幾點,

總結(基類有虛函式):

1、每乙個類都有虛表。

編譯器會為每個有虛函式的類建立乙個虛函式表,該虛函式表將被該類的所有物件共享。類的每個虛成員佔據虛函式表中的一行。

2、每個物件例項的最前面都有乙個虛函式指標,指向虛函式表。

3、虛表可以繼承,如果

子類沒有重寫虛函式,那麼子類虛表中仍然會有該函式的位址

,只不過這個位址指向的是基類的虛函式實現

。如果基類3個虛函式,那麼基類的虛表中就有三項(虛函式位址),派生類也會有虛表,至少有三項,如果

重寫了相應的虛函式,那麼虛表中的位址就會改變,指向自身的虛函式實現。

如果派生類有自己的虛函式,那麼虛表中就會新增該項。

4、派生類的虛表中虛函式位址的排列順序和基類的虛表中虛函式位址排列順序相同。

5、虛函式是

執行時多型,一定要通過物件來呼叫,有隱藏的this指標;而static函式是在類建立時就會生成

,無需物件例項呼叫,沒有隱藏的this指標,所以static函式不能用virtual修飾。

6. 建構函式不能是虛函式。

虛函式的呼叫需要虛函式表指標,而該指標存放在物件的內容空間中。若建構函式宣告為虛函式,那麼由於物件還未建立,還沒有記憶體空間,更沒有虛函式表位址用來呼叫虛函式。

C 多型的實現及原理

c 的多型性用一句話概括就是 在基類的函式前加上virtual關鍵字,在派生類中重寫該函式,執行時將會根據物件的實際型別來呼叫相應的函式。如果物件型別是派生類,就呼叫派生類的函式 如果物件型別是基類,就呼叫基類的函式 1 用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。2 存在...

C 多型的實現及原理

c 的多型性用一句話概括就是 在基類的函式前加上virtual關鍵字,在派生類中重寫該函式,執行時將會根據物件的實際型別來呼叫相應的函式。如果物件型別是派生類,就呼叫派生類的函式 如果物件型別是基類,就呼叫基類的函式 1 用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。2 存在...

C 多型的實現及原理

c 的多型性用一句話概括就是 在基類的函式前加上virtual關鍵字,在派生類中重寫該函式,執行時就會根據物件的實際型別來呼叫相應的函式,如果物件型別是派生類,就呼叫派生類中的函式,如果物件型別是基類,就呼叫基類函式。1.用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。2.存在...