多型: 將派生類物件視為基類物件,執行派生類物件的操作, 可用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 通過除錯我們以看到在...