小編話不多說,接着上篇的寫。
虛函數
當父類指針或引用指向子類對象,而子類中又覆蓋了父類的函數,希望用父類指針或父類引用,調用到正確的版本的函數(即子類中的函數),需要把該函數成員聲明爲虛函數。
虛析構函數
如果一個類有子類,則這個類(父類)的析構函數必須是虛函數,即虛析構。
寫法:virtual~A
爲什麼要定義虛析構函數:(原因)
如果父類的析構不虛析構,則當(用delete)刪除一個指向子類對象的父類指針時,將調用父類版本的析構函數,子類只會釋放了來自於父類的那部分成員變量,而子類自己擴展的成員沒有被釋放,造成內存泄露。
這裏會涉及動態綁定,裏邊設計內容稍多點,小編我轉載了一篇很好的博客,有興趣的可以看一下,標題是c++靜態綁定和動態綁定。
多態的代價:
因爲我們使用了虛函數實現多態,在使用虛函數時,會給對象附帶一個虛指針,然後給類中添加虛函數表,這個虛指針指向虛函數表,虛函數表當中,包含有所有指向虛函數的指針,此時,我們通過類的對象去調用虛函數,首先會通過虛指針去尋找虛函數表,通過虛函數表中的函數指針去尋找虛函數,這樣就會進行2次尋址,降低了程序運行的效率,並且對象中的虛指針增加了內存空間,這就是使用多態的代價。
抽象基類和純虛函數:
純虛函數:虛函數末尾=0,這個函數就是純虛函數,他沒有函數體,不需要實現。例如:virtual void draw()=0;
純虛函數的作用:提供了子類公用的統一接口。
抽象類:擁有純虛函數的類叫做抽象類,抽象類無非實現實例化。
抽象基類:只能作爲基類的抽象類。
子類繼承了抽象類後,如果在子類中沒有實現父類的全部的純虛函數,那麼這個子類也將成爲抽象類,無法創建對象。
多繼承
多繼承指一個子類有兩個或者兩個以上的父類。
多繼承通常是導致程序出現問題的原因。
多繼承主要有三個常見問題:
(1) 不同父類有同名函數,如何區分?
(2) 兩個父類有共同的祖先。
解決辦法:
(1)直接繼承祖先的兩個父類,在繼承時加virtual。(兩個父類虛繼承父類,子類調用這個同名函數時會直接調用祖先類)。
(2)通過多重繼承而來的那個子類(孫子輩),在構造函數時,要調用祖先類的構造函數。孫子輩的派生類,直接繼承祖先類的成員,再繼承兩個父類各自拓展的成員。