C++繼承中建構函式、解構函式調用順序及虛解構函式

來源:互聯網
上載者:User

首先說說建構函式,大家都知道建構函式裡就可以調用成員變數,而繼承中子類是把基類的成員變成自己的成員,那麼也就是說子類在建構函式裡就可以調用基類的成員了,這就說明建立子類的時候必須先調用基類的建構函式,只有這樣子類才能在建構函式裡使用基類的成員,所以是建立子類時先調用基類的建構函式然後再調用自己的建構函式。通俗點說,你要用某些物品,但這些物品你沒辦法自己生產,自然就要等別人生產出來,你才能拿來用。

接著就是解構函式了,上面說到子類是將基類的成員變成自己的成員,那麼基類就會只存在子類中直到子類調用解構函式後。做個假設:假如在基類的解構函式調用比子類的先,這樣會發生什麼事呢?類成員終止了,而類本身卻還在,但是在類存在的情況下,類成員就應該還存在的,這不就產生矛盾了嗎?所以子類是調用自身的解構函式再調用基類的解構函式。基類的解構函式必須設定為虛的,而作為最終子類則可以是虛的也可以不是虛的,因為沒有其他類繼承於它不會影響最終功能。但又不是所有類的解構函式都設定為虛的比較好,因為存在虛函數的類執行個體化時會額外添加一個虛表指標,浪費記憶體效能。

現在到了虛函數了,virtual主要作用是在多態方面,而C++的多態最主要的是類的動態綁定,動態綁定則是指將子類的指標或引用轉換成基類,基類對象就可以動態判斷調用哪個子類成員函數。這就說明在沒有子類指標或引用轉換為基類對象的話,virtual沒有存在意義(純虛函數除外),也就是有沒有virtual都是調用其自身的成員函數。通過這些分析,對於virtual就有了眉目了。當子類指標或引用轉換為基類時,若基類中有用virtual定義的函數,被子類重寫後,此基類對象就會根據子類調用子類中的重寫後的函數,而不是基類中的函數;反之,若是基類中沒有用virtual定義,則不管基類被賦值的是哪個子類的值,調用的都是基類的成員函數(當然指的值子類重載的基類函數,不然就算要調用子類特有的成員函數也會編譯不過)。

存在虛解構函式為什麼不會存在虛建構函式呢?

建構函式不能是虛函數,因為構造子類時本身也是調用的子類建構函式,然後子類建構函式會調用基類建構函式,所以虛建構函式的存在是沒有意義的。只有在構造完成後,對象才能成為一個類的名符其實的執行個體。另外,靜態成員函數和內嵌函式也不能是虛函數。

虛函數是針對對象的,不是針對類的.

這一點可以從類成員函數(即靜態成員函數)不能是虛函數看出來.倘若類不被執行個體化為對象,虛函數的存在本身也沒意義.

上面的假設我感覺並不認可,衍生類別中的構造,析構可以調用到基類的構造析構是由編譯器編譯中實現的.即:在子類建構函式開頭自動添加預設的基類建構函式或初始化列表中指定的基類建構函式調用;在子類解構函式末尾自動添加其基類解構函式調用.

至於為什麼會先調用基類建構函式再調用子類建構函式,先調用子類解構函式再調用基類解構函式.我認為:因為只可能出現子類中成員依賴基類成員的存在而存在,而不會出現基類中成員依賴子類成員存在.例如:子類中有一個成員是基類中一個指標成員所指向對象的引用.則這種情況下倘若沒有先調用基類建構函式對其指標成員初始化建立對象.那子類引用初始化時便不知會指向何處.同樣析構時倘若先調用基類將其中的對象釋放後,此時子類中引用變數在做一下善後處理時也便沒有任何意義,因而其指向對象已經釋放掉了. 衍生類別對象中基類成員先於子類成員存在,後於子類對象消失.

不知道初始化列表中倘若基類建構函式在其他子類成員初始化之後產生的程式碼中基類建構函式調用是否還會在其他代碼之前.這樣子在GCC中會警示,但可以編譯通過,而且感覺其產生代碼中也會按照初始化列表中順序調用.即建構函式調用被放到了其他子類成員後面,因為代碼就是這麼寫的.(這句我也不是那麼確定的)

 

虛函數與繼承中建構函式功能的實現最終都是編譯器幫我們做的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.