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

來源:互聯網
上載者:User

標籤:變數   虛函數   成員變數   轉換   效能   track   post   繼承   而不是   

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

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

如今到了虛函數了。virtual主要作用是在多態方面,而C++的多態最基本的是類的動態綁定,動態綁定則是指將子類的指標或引用轉換成基類,基類對象就能夠動態推斷調用哪個子類成員函數。

這就說明在沒有子類指標或引用轉換為基類對象的話。virtual沒有存在意義(純虛函數除外)。也就是有沒有virtual都是調用其自身的成員函數。通過這些分析,對於virtual就有了眉目了。

當子類指標或引用轉換為基類時,若基類中實用virtual定義的函數,被子類重寫後。此基類對象就會依據子類調用子類中的重寫後的函數,而不是基類中的函數;反之,若是基類中沒實用virtual定義,則無論基類被賦值的是哪個子類的值,調用的都是基類的成員函數(當然指的值子類重載的基類函數,不然就算要調用子類特有的成員函數也會編譯只是)。

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

建構函式不能是虛函數,由於構造子類時本身也是調用的子類建構函式,然後子類建構函式會調用基類建構函式。所以虛建構函式的存在是沒有意義的。

僅僅有在構造完畢後,對象才幹成為一個類的名符事實上的執行個體。

另外,靜態成員函數和內嵌函式也不能是虛函數。

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

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


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

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.