第三十四節 C 多型原理與虛函式表

2021-08-18 17:44:43 字數 1782 閱讀 8947

多型: 將派生類物件視為基類物件,執行派生類物件的操作, 可用virtual實現多型。

下面**存在兩個問題:

#include using namespace std;

/* 這段**將存在兩個嚴重問題:

* 1. 當在函式veritywhitchclass()傳入乙個物件時,我們希望它執行被傳入物件的方法,但這裡執行了基類的方法

* 2. 當delete傳入的物件指標時, 應該將先釋放子類物件,再釋放基類物件,這裡僅僅釋放了基類物件,造成了記憶體洩漏

*/class baseclass

baseclass()

~baseclass()

};/*例項化物件時,將建立兩個物件,子物件和基類物件,通過從呼叫的建構函式可以看出*/

class sonclass : public baseclass

sonclass()

~sonclass()

};/*這裡採用了指標傳入(也可以採用引用方式),而沒有採用值傳入的方式,為了防止出現淺複製*/

void veritywhitchclass(baseclass* base)

int main()

output:

baseclass constructor

sonclass constructor

this is basecalss             //錯誤,呼叫了基類的方法,沒有呼叫派生類的方法

~baseclass deconstructor   //錯誤,只對基類物件進行析構,沒有對派生類物件進行析構

這裡將解決上面的問題,也就是實現多型。

#include using namespace std;

class baseclass

baseclass()

/*用關鍵字virtual將函式宣告為虛析構函式*/

virtual ~baseclass()

};/*例項化物件時,將建立兩個物件,子物件和基類物件,通過從呼叫的建構函式可以看出*/

class sonclass : public baseclass

sonclass()

~sonclass()

};void veritywhitchclass(baseclass* base)

int main()

output: 

baseclass constructor

sonclass constructor

this is sonclass     //呼叫正確,呼叫了派生類物件的方法

~sonclass deconstructor //析構了兩個物件

~baseclass deconstructor

多型的原理:在例項化含有虛函式的類時,會在物件中產生乙個虛函式表指標(通過列印物件的大小可以看出多了4byte)。

這個指標指向虛函式表,虛函式表中存放著虛函式的位址,每個虛函式均指向函式實現。

1. 對於基類:虛函式指向基類的虛函式實現。

2. 對於派生類:虛函式指向派生類的虛函式實現,若繼承來的虛函式,沒有在派生類中實現,指向基類的虛函式實現。

3. 當派生類物件被視為基類物件時(派生類型別轉成基類型別),雖然型別被轉變,但虛函式表指標(位址)並沒有發生改變,仍然是派生類的虛函式指標,所有在呼叫基類的函式時,會呼叫派生類的虛函式實現。

c 虛函式表與多型

本篇文章是對b站上乙個課程的筆記 對於乙個空類,其sizeof值是1 對空類加入兩個普通成員函式,其sizeof仍然是1 只有成員變數會占用記憶體空間,普通成員函式並不會占用空間 繼續加入乙個虛函式,sizeof值變成了4!這是因為,如果類中存在虛函式,則編譯器就會在類中插入乙個看不見的成員變數,也...

c 虛函式與虛函式表原理

目錄 用virtual修飾的成員函式叫虛函式 小知識 沒有虛建構函式 不寫虛函式,沒有預設的虛函式 普通函式不影響類的記憶體 class mm protected void testvirtual int main 輸出 1 增加乙個指標的記憶體,32位作業系統多4個位元組 64位作業系統多8個位元...

c 多型的原理 以及虛函式表詳解

c 中多型的原理 要實現多型,必然在背後有自己的實現機制,如果不了解其背後的機制,就很難對其有更深的理解。乙個多型的例子 class person class children public person class parents public person int main 通過除錯我們以看到在...