c++繼承下

小編話不多說,接着上篇的寫。

虛函數

當父類指針或引用指向子類對象,而子類中又覆蓋了父類的函數,希望用父類指針或父類引用,調用到正確的版本的函數(即子類中的函數),需要把該函數成員聲明爲虛函數。

虛析構函數

如果一個類有子類,則這個類(父類)的析構函數必須是虛函數,即虛析構。

寫法:virtual~A

爲什麼要定義虛析構函數:(原因)

如果父類的析構不虛析構,則當(用delete)刪除一個指向子類對象的父類指針時,將調用父類版本的析構函數,子類只會釋放了來自於父類的那部分成員變量,而子類自己擴展的成員沒有被釋放,造成內存泄露。

這裏會涉及動態綁定,裏邊設計內容稍多點,小編我轉載了一篇很好的博客,有興趣的可以看一下,標題是c++靜態綁定和動態綁定。

多態的代價:

因爲我們使用了虛函數實現多態,在使用虛函數時,會給對象附帶一個虛指針,然後給類中添加虛函數表,這個虛指針指向虛函數表,虛函數表當中,包含有所有指向虛函數的指針,此時,我們通過類的對象去調用虛函數,首先會通過虛指針去尋找虛函數表,通過虛函數表中的函數指針去尋找虛函數,這樣就會進行2次尋址,降低了程序運行的效率,並且對象中的虛指針增加了內存空間,這就是使用多態的代價。


抽象基類和純虛函數:

純虛函數:虛函數末尾=0,這個函數就是純虛函數,他沒有函數體,不需要實現。例如:virtual void draw()=0;

純虛函數的作用:提供了子類公用的統一接口。

抽象類:擁有純虛函數的類叫做抽象類,抽象類無非實現實例化。

抽象基類:只能作爲基類的抽象類。

子類繼承了抽象類後,如果在子類中沒有實現父類的全部的純虛函數,那麼這個子類也將成爲抽象類,無法創建對象。


多繼承

多繼承指一個子類有兩個或者兩個以上的父類。

多繼承通常是導致程序出現問題的原因。

多繼承主要有三個常見問題:

(1)  不同父類有同名函數,如何區分?

(2)  兩個父類有共同的祖先。

解決辦法:

(1)直接繼承祖先的兩個父類,在繼承時加virtual。(兩個父類虛繼承父類,子類調用這個同名函數時會直接調用祖先類)。

(2)通過多重繼承而來的那個子類(孫子輩),在構造函數時,要調用祖先類的構造函數。孫子輩的派生類,直接繼承祖先類的成員,再繼承兩個父類各自拓展的成員。




發佈了26 篇原創文章 · 獲贊 17 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章