C++继承中析构函数 构造函数的调用顺序以及虚析构函数
首先說說構造函數(shù)。大家都知道構造函數(shù)里就能夠調用成員變量,而繼承中子類是把基類的成員變成自己的成員,那么也就是說子類在構造函數(shù)里就能夠調用基類的成員了,這就說明創(chuàng)建子類的時候必須先調用基類的構造函數(shù),僅僅有這樣子類才干在構造函數(shù)里使用基類的成員,所以是創(chuàng)建子類時先調用基類的構造函數(shù)然后再調用自己的構造函數(shù)。通俗點說,你要用某些物品。但這些物品你沒辦法自己生產(chǎn),自然就要等別人生產(chǎn)出來,你才干拿來用。
接著就是析構函數(shù)了,上面說到子類是將基類的成員變成自己的成員,那么基類就會僅僅存在子類中直到子類調用析構函數(shù)后。做個如果:假如在基類的析構函數(shù)調用比子類的先。這樣會發(fā)生什么事呢?類成員終止了,而類本身卻還在,可是在類存在的情況下。類成員就應該還存在的,這不就產(chǎn)生矛盾了嗎?所以子類是調用自身的析構函數(shù)再調用基類的析構函數(shù)。基類的析構函數(shù)必須設置為虛的,而作為終于子類則能夠是虛的也能夠不是虛的,由于沒有其它類繼承于它不會影響終于功能。但又不是全部類的析構函數(shù)都設置為虛的比較好。由于存在虛函數(shù)的類實例化時會額外加入一個虛表指針。浪費內存性能。
如今到了虛函數(shù)了。virtual主要作用是在多態(tài)方面,而C++的多態(tài)最基本的是類的動態(tài)綁定,動態(tài)綁定則是指將子類的指針或引用轉換成基類,基類對象就能夠動態(tài)推斷調用哪個子類成員函數(shù)。
這就說明在沒有子類指針或引用轉換為基類對象的話。virtual沒有存在意義(純虛函數(shù)除外)。也就是有沒有virtual都是調用其自身的成員函數(shù)。通過這些分析,對于virtual就有了眉目了。
當子類指針或引用轉換為基類時,若基類中實用virtual定義的函數(shù),被子類重寫后。此基類對象就會依據(jù)子類調用子類中的重寫后的函數(shù),而不是基類中的函數(shù);反之,若是基類中沒實用virtual定義,則無論基類被賦值的是哪個子類的值,調用的都是基類的成員函數(shù)(當然指的值子類重載的基類函數(shù),不然就算要調用子類特有的成員函數(shù)也會編譯只是)。
存在虛析構函數(shù)為什么不會存在虛構造函數(shù)呢?
構造函數(shù)不能是虛函數(shù),由于構造子類時本身也是調用的子類構造函數(shù),然后子類構造函數(shù)會調用基類構造函數(shù)。所以虛構造函數(shù)的存在是沒有意義的。
僅僅有在構造完畢后,對象才干成為一個類的名符事實上的實例。
另外,靜態(tài)成員函數(shù)和內聯(lián)函數(shù)也不能是虛函數(shù)。
虛函數(shù)是針對對象的,不是針對類的.
這一點能夠從類成員函數(shù)(即靜態(tài)成員函數(shù))不能是虛函數(shù)看出來.倘若類不被實例化為對象,虛函數(shù)的存在本身也沒意義.
上面的如果我感覺并不認可,派生類中的構造,析構能夠調用到基類的構造析構是由編譯器編譯中實現(xiàn)的.即:在子類構造函數(shù)開頭自己主動加入默認的基類構造函數(shù)或初始化列表中指定的基類構造函數(shù)調用;在子類析構函數(shù)末尾自己主動加入其基類析構函數(shù)調用.
至于為什么會先調用基類構造函數(shù)再調用子類構造函數(shù),先調用子類析構函數(shù)再調用基類析構函數(shù).我覺得:由于僅僅可能出現(xiàn)子類中成員依賴基類成員的存在而存在,而不會出現(xiàn)基類中成員依賴子類成員存在.比如:子類中有一個成員是基類中一個指針成員所指向對象的引用.則這樣的情況下倘若沒有先調用基類構造函數(shù)對其指針成員初始化創(chuàng)建對象.那子類引用初始化時便不知會指向何處.相同析構時倘若先調用基類將當中的對象釋放后,此時子類中引用變量在做一下善后處理時也便沒有不論什么意義,因而其指向對象已經(jīng)釋放掉了. 派生類對象中基類成員先于子類成員存在,后于子類對象消失.
轉載于:https://www.cnblogs.com/gavanwanggw/p/6916131.html
總結
以上是生活随笔為你收集整理的C++继承中析构函数 构造函数的调用顺序以及虚析构函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目持续集成工具
- 下一篇: Unix和Linux的区别和联系