日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ map 析构函数_C++|类继承关系中的虚函数、虚析构函数、虚基类

發布時間:2023/12/15 c/c++ 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++|类继承关系中的虚函数、虚析构函数、虚基类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。