當通過基類(父類)的指標,指向多個子類,達到多型時,父類指標可以使用子類的成員變數和成員函式,做到「乙個介面,多種實現」
c++的多型,可以理解為,用乙個父類 ( 基類 ) 指標來操控多種子類,倘若這些子類分別用指標來操控,就很容易亂,例如有 100000 個子類,至少需要 100000個指標來操控(僅限於指標操作,例項另外),指標很容易出錯,尤其是在析構的時候,要記得釋放記憶體。但多型可以做到乙個指標,操控所有子類。
增強理解:乙個電腦 usb 介面可以連手機,u盤,行動硬碟等,不需要那麼多 usb 介面,乙個可以操作了 。
析構函式不可以是純虛函式
基類指標,指向子類物件,在程式最後,要根據析構函式,釋放記憶體。析構函式可能呼叫多個,也可能呼叫乙個。
#include using namespace std ;
class gragh
} ;class point : public gragh
} ;int main ()
程式執行結果
這裡錯在用基類指標銷毀子類記憶體時,不宣告虛析構函式 virtual ,呼叫的是基類的析構函式,而不是子類的析構函式,子類獨自分配的那一塊記憶體空間沒被釋放掉,記憶體容易洩漏。
#include using namespace std ;
// 虛表是每個含有虛函式的類中維護的一張儲存著各個虛函式位址的表
// 每個含有虛函式的類中都儲存著乙個指向虛表的指標,
// 而虛表中儲存了該類各個虛函式的位址。
// 程式會找到子類的虛函式表,然後呼叫子類的函式
// 用父類指標實現多型時, 如果在類中沒有static變數、enum常量等
// 且沒有記憶體分配的情況下,析構函式可以不使用 virtual
class gragh
} ;class point : public gragh
} ;int main ()
// 總結:
// 1. gragh *ptr = new point
// ptr 的靜態型別是 gragh, 動態型別是 point
// 當父類析構函式是虛函式, 是動態繫結, 執行時會根據動態型別
// 呼叫子類的析構函式, 由於繼承關係, 也會呼叫父類的析構函式
// 當父類析構函式不是虛函式, 是靜態繫結, 會呼叫靜態型別,
// 只會呼叫父類自己的析構函式
// 以上說的是父類指標指向子類, 實現多型的情況
// 但是, 如果 point *ptr = new point, 本來就是 point, 先呼叫
// point 的析構函式, 再呼叫 gragh 的析構函式
程式執行結果
C 析構函式和虛析構函式。
析構函式如果不是虛的話,基類的析構函式將不會被呼叫。多型時,也就是派生類被基類指標所指,或者被基類別名 虛析構函式,被呼叫時,其自身的析構函式和基類的析構函式都將會被呼叫。非虛的時候,不進行多型,只有基類的會被呼叫。純虛析構函式 定義的時候除了加 0 還需要給出函式的實現。因為當遞迴的呼叫析構函式時...
C 學習筆記 虛析構函式與純虛析構函式
開始學c 了,所以又重拾以前學習過的相關概念 析構函式是當乙個物件的生命週期結束時,會自動執行析構函式。析構函式的定義 define a h class a endif 虛析構函式與純虛析構函式的定義 假定類名為a define a h class a endif define a h class ...
C 學習筆記 虛析構函式與純虛析構函式
析構函式是當乙個物件的生命週期結束時,會自動執行析構函式。析構函式的定義 private int a int b int c endif 虛析構函式與純虛析構函式的定義 假定類名為a private int a int b int c endif endif 其中定義了純虛函式後,類a就成為了 抽象...