本期是C++基礎語法分享的第七節,今天給大家來分享一下:
(1)虛析構函數;
(2)純虛函數;
(3)虛函數、純虛函數;
(4)虛函數指針、虛函數表;
(5)虛繼承;
(6)虛繼承、虛函數;
(7)模板類、成員模板、虛函數;
虛析構函數
虛析構函數是為了解決基類的指針指向派生類對象,并用基類的指針刪除派生類對象。
虛析構函數使用
class Shape{public: Shape(); // 構造函數不能是虛函數 virtual double calcArea(); virtual ~Shape(); // 虛析構函數};class Circle : public Shape // 圓形類{public: virtual double calcArea(); 。。。};int main(){ Shape * shape1 = new Circle(4.0); shape1-》calcArea(); delete shape1; // 因為Shape有虛析構函數,所以delete釋放內存時,先調用子類析構函數,再調用基類析構函數,防止內存泄漏。 shape1 = NULL; return 0;}
純虛函數
純虛函數是一種特殊的虛函數,在基類中不能對虛函數給出有意義的實現,而把它聲明為純虛函數,它的實現留給該基類的派生類去做。
virtual int A() = 0;
虛函數、純虛函數
類里如果聲明了虛函數,這個函數是實現的,哪怕是空實現,它的作用就是為了能讓這個函數在它的子類里面可以被覆蓋(override),這樣的話,編譯器就可以使用后期綁定來達到多態了。純虛函數只是一個接口,是個函數的聲明而已,它要留到子類里去實現。
虛函數在子類里面可以不重寫;但純虛函數必須在子類實現才可以實例化子類。
虛函數的類用于 “實作繼承”,繼承接口的同時也繼承了父類的實現。純虛函數關注的是接口的統一性,實現由子類完成。
帶純虛函數的類叫抽象類,這種類不能直接生成對象,而只有被繼承,并重寫其虛函數后,才能使用。抽象類被繼承后,子類可以繼續是抽象類,也可以是普通類。
虛基類是虛繼承中的基類,暫不做詳細說明。
虛函數指針、虛函數表
虛函數指針:在含有虛函數類的對象中,指向虛函數表,在運行時確定。
虛函數表:在程序只讀數據段,存放虛函數指針,如果派生類實現了基類的某個虛函數,則在虛表中覆蓋原本基類的那個虛函數指針,在編譯時根據類的聲明創建。
虛繼承
虛繼承用于解決多繼承條件下的菱形繼承問題(浪費存儲空間、存在二義性)。
底層實現原理與編譯器相關,一般通過虛基類指針和虛基類表實現,每個虛繼承的子類都有一個虛基類指針(占用一個指針的存儲空間,4字節)和虛基類表(不占用類對象的存儲空間)(需要強調的是,虛基類依舊會在子類里面存在拷貝,只是僅僅最多存在一份而已,并不是不在子類里面了);當虛繼承的子類被當做父類繼承時,虛基類指針也會被繼承。
實際上,vbptr 指的是虛基類表指針(virtual base table pointer),該指針指向了一個虛基類表(virtual table),虛表中記錄了虛基類與本類的偏移地址;通過偏移地址,這樣就找到了虛基類成員,而虛繼承也不用像普通多繼承那樣維持著公共基類(虛基類)的兩份同樣的拷貝,節省了存儲空間。
虛繼承、虛函數
相同之處:都利用了虛指針(均占用類的存儲空間)和虛表(均不占用類的存儲空間)
不同之處:
虛繼承
(1)虛基類依舊存在繼承類中,只占用存儲空間
(2)虛基類表存儲的是虛基類相對直接繼承類的偏移
虛函數
(1)虛函數不占用存儲空間
(2)虛函數表存儲的是虛函數地址
模板類、成員模板、虛函數
模板類中可以使用虛函數
一個類(無論是普通類還是類模板)的成員模板(本身是模板的成員函數)不能是虛函數
抽象類、接口類、聚合類
抽象類:含有純虛函數的類
接口類:僅含有純虛函數的抽象類
聚合類:用戶可以直接訪問其成員,并且具有特殊的初始化語法形式。滿足如下特點:
(1)所有成員都是 public
(2)沒有定義任何構造函數
(3)沒有類內初始化
(4)沒有基類,也沒有 virtual 函數
今天的分享就到這里了,大家要好好學C++喲~
編輯:jq
-
Virtual
+關注
關注
0文章
23瀏覽量
12289 -
函數
+關注
關注
3文章
4346瀏覽量
62972 -
指針
+關注
關注
1文章
481瀏覽量
70609
原文標題:C++基礎語法梳理:虛函數及其相關知識點
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
Docker-鏡像的分層-busybox鏡像制作
![Docker-鏡像的分層-busybox鏡像制作](https://file1.elecfans.com/web3/M00/06/0F/wKgZO2eHIVWABdMXAAAXs32FF8s788.png)
Aigtek功率放大器應用:電感線圈的知識點分享
![Aigtek功率放大器應用:電感線圈的<b class='flag-5'>知識點</b>分享](https://file1.elecfans.com//web3/M00/04/41/wKgZO2dx_leAVMfAAAXXplP3dbU965.png)
芯片良率相關知識點詳解
![芯片良率<b class='flag-5'>相關</b><b class='flag-5'>知識點</b><b class='flag-5'>詳解</b>](https://file1.elecfans.com/web3/M00/04/39/wKgZPGdyCP2AVpTMAAA9pmejbE0624.png)
一文詳解信號的回流路徑
![<b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>詳解</b>信號的回流路徑](https://file1.elecfans.com/web3/M00/03/B5/wKgZO2drbG2AQyu_AAAoyBe5n9w625.png)
后悔沒有早點看到:天線設計中的知識點!
![后悔沒有早點看到:天線設計中的<b class='flag-5'>知識點</b>!](https://file1.elecfans.com/web3/M00/03/7B/wKgZO2dpElSAM8gWAACQRmlorfs337.png)
單片機中斷相關知識點
一文解讀PSpice中的收斂性問題及其相關因素
![<b class='flag-5'>一</b><b class='flag-5'>文</b>解讀PSpice中的收斂性問題<b class='flag-5'>及其</b><b class='flag-5'>相關</b>因素](https://file.elecfans.com/web2/M00/27/37/poYBAGHBmA2AD7e7AAAahjWuYP4250.jpg)
一篇搞定DCS系統相關知識點
![<b class='flag-5'>一</b>篇搞定DCS系統<b class='flag-5'>相關</b><b class='flag-5'>知識點</b>](https://file1.elecfans.com//web2/M00/C5/D7/wKgZomYCpiOAakfcAAGWO8D1Gg0039.png)
評論