c++ map 析构函数_C++|类继承关系中的虚函数、虚析构函数、虚基类
在繼承關系中,虛函數、虛析構函數、虛基類中使用的關鍵字virtual都是在告訴編譯器,此處要進行特殊處理:
虛函數:函數重寫時的要求編譯器動態綁定來實現多多態 ;
虛析構函數:當基類指針指向在堆內實現的派生類的動態對象時,virtaul聲明的基類析構函數是告訴編譯器,還要調用派生類的析構函數。
虛基類:當派生類有多重繼承和多繼承時,在繼承鏈上有兩個子類繼承自同一基類時,此兩個子類作為基類再次派生出一個類,若只想保存這兩個子類的基類的一個實例,需用virtual來聲明繼承關系,編譯器對虛基類只實現一個實例,從而避免二義性。
1 虛函數
面向對象的在繼承時要實現動態多態,需要用關鍵字virtual告訴編譯器,由編譯器在編譯時生成一個虛函數表,程序運行時實現每個對象通過一個自動添加的函數指針來動態綁定一個函數去實現多態:
#includeclass CShape{public:virtual double Area(){cout<Area()<Area()<2 虛析構函數
在實現多態時,如果是由基類指針指向在堆上動態創建派生對象時,如果delete此虛類指針,則基類的析構函數被調用,并不會調用派生類的析構函數,如果派生類中有在堆上動態創建的數據時,則會出現內存泄露。C++編譯器的做法時,如果基類的析構函數前面有用virtual修飾,編譯器會自動去調用派生類的析構函數(實現動態綁定,如果其它成員函數的動態綁定一樣),做內存釋放的工作。
如果某個類不包含虛函數,那一般是表示它將不作為一個基類來使用。當一個類不準備作為基類使用時,使析構函數為虛一般是個壞主意。因為它會為類增加一個虛函數表,使得對象的體積翻倍,還有可能降低其可移植性。實際上,很多人這樣總結:當且僅當類里包含至少一個虛函數的時候才去聲明虛析構函數。
虛析構函數是為了解決這樣的一個問題:基類的指針指向派生類對象,并動態調用派生類的析構函數。
#include using namespace std;class CSon{public:~CSon(){cout<3 虛基類
當在多條繼承路徑上有一個公共的基類,在這些路徑中的某幾條匯合處,這個公共的基類就會產生多個實例(或多個副本),若只想保存這個基類的一個實例,可以將這個公共基類說明為虛基類。
如果將這種多繼承和多重繼承畫成圖形關系,會有菱形的圖案出現,稱為菱形繼承:
如圖,子類D最后會接受分別來自B和C的同一個或多個相同拷貝,從而產生了多個拷貝,即不止一次的通過多個路徑繼承類在內存中創建了基類成員的多份拷貝。而這些是B和C從父類繼承而來,所以D類該繼承B還是C傳下來的,還是都接受呢?這樣就產生歧義(二義性),虛基類的基本原則是在內存中只有基類成員的一份拷貝。這樣,通過把基類繼承聲明為虛擬的(virtual限定符),就只能繼承基類的一份拷貝,從而消除歧義。
#includeclass base { protected: int a; public: base(){ cout <輸出結果為:0123,如果省略掉其中的關鍵字virtual,則輸出01023,可以看出,構造函數有重復調用。
-End-
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的c++ map 析构函数_C++|类继承关系中的虚函数、虚析构函数、虚基类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广州一宝马SUV冲撞人群 官方通报:已致
- 下一篇: python 多个列表合并_Python