C 多型的實現及原理複習

2021-09-19 20:36:40 字數 1435 閱讀 6585

c++的多型性概括就是:在基類的函式前加上virtual關鍵字,在派生類中重寫該函式,執行時將會根據物件的實際型別來呼叫相應的函式。如果物件型別是派生類,就呼叫派生類的函式;如果物件型別是基類,就呼叫基類的函式

1:用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。  

2:存在虛函式的類都有乙個一維的虛函式表叫做虛表,類的物件有乙個指向虛表開始的虛指標。虛表是和類對應的,虛表指標是和物件對應的。  

3:多型性是乙個介面多種實現,是物件導向的核心,分為類的多型性和函式的多型性。  

4:多型用虛函式來實現,結合動態繫結.  

5:純虛函式是虛函式再加上 = 0;  

6:抽象類是指包括至少乙個純虛函式的類。

純虛函式:virtual void fun()=0;即抽象類!必須在子類實現這個函式,即先有名稱,沒有內容,在派生類實現內容。

#include using namespace std;

class animal

//animal() //不帶引數的建構函式

virtual ~animal() //!!!!!虛析構函式,否則子類的析構函式不會被呼叫

virtual void f()

void ff()

private:

int adata;

};class cat : public animal

virtual ~cat() //子類可以虛析構也可以不虛析構

void f()

void ff()

private:

int t;

};int main()

總結(基類有虛函式的):

1:每乙個類都有虛表

2:虛表可以繼承,如果子類沒有重寫虛函式,那麼子類虛表中仍然會有該函式的位址,只不過這個位址指向的是基類的虛函式實現,如果基類有3個虛函式,那麼基類的虛表中就有三項(虛函式位址),派生類也會虛表,至少有三項,如果重寫了相應的虛函式,那麼虛表中的位址就會改變,指向自身的虛函式實現,如果派生類有自己的虛函式,那麼虛表中就會新增該項。

這就是c++中的多型性,當c++編譯器在編譯的時候,發現father類的say()函式是虛函式,這個時候c++就會採用晚繫結技術,也就是編譯時並不確定具體呼叫的函式,而是在執行時,依據物件的型別來確認呼叫的是哪乙個函式,這種能力就叫做c++的多型性,我們沒有在say()函式前加virtual關鍵字時,c++編譯器就確定了哪個函式被呼叫,這叫做早期繫結。

c++的多型性就是通過晚繫結技術來實現的。

c++的多型性用一句話概括就是:在基類的函式前加上virtual關鍵字,在派生類中重寫該函式,執行時將會根據物件的實際型別來呼叫相應的函式,如果物件型別是派生類,就呼叫派生類的函式,如果物件型別是基類,就呼叫基類的函式。

參考

C 多型實現及原理

include include using namespace std class person men women 執行結果 men 1peter women 2lily delete men delete person delete women delete person 繼承機制中,子類訪問父...

C 多型的實現及原理

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

C 多型的實現及原理

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