基类与派生类的析构函数不是继承关系,继承析构里也没声明调用,为什么会自动调用基类析构呢?
光阴似箭催人老,日月如移越少年。
析构函数的主要作用,就是在該類別實例物件不需要的時候,對這個物件進行一些清理作用(主要是記憶體的釋放.)一個基类,它也是一個類別,它也可以有物件, 所以基底類別的析構函數負責基底類別內部開啟的一些記憶體的清理工作.
析构函数
基类
那麼, 對於派生类. 可能會產生一些內存的開銷, 那麼派生類也需要構造函數. 基類只了解基類內部的內存開銷, 派生類只了解派生類自己的內存開銷. 他們之間互不了解. 繼承關係, 多數都是建立在擴充基類的關係上.
派生类
派生類別豐富了基底類別, 如果派生類別的實例物件在銷毀的時候, 不去自動呼叫基底類別的析構函數, 那麼請問? 基底類別的清理工作誰去做? 基类的内部, 有一些是派生类不了解的. 為了方便,為了安全,為了管理. 所以派生類別的物件銷毀的時候, 繼承機制會分級呼叫各級的析構函數.
基类的内部, 有一些是派生类不了解的.
内存的清理工作必须严格要求. 谁开辟的,谁最后释放. 一人做事兒一人當. 孩子闖了禍, 不應該讓老爹去認錯. 同時繼承關係, 基類有基類的責任, 派生類有派生類的責任. 分工明確了, 不能越俎代庖. 各部門相互協調, 程序才能順暢運作.
内存的清理工作必须严格要求. 谁开辟的,谁最后释放.
在衍生類別的析構函數中不用明確地呼叫基底類別的析構函數,因為每個類別只有一個析構函數,編譯器知道如何選擇,無需程式設計師干涉。
另外析構函數的執行順序和建構子的執行順序也剛好相反:建立衍生類別物件時,建構子的執行順序和繼承順序相同,即先執行基底類別建構函數,再執行派生類別構造函數。 而銷毀派生類別物件時,析構函數的執行順序和繼承順序相反,即先執行衍生類別析構函數,再執行基底類別析構函數。
1.衍生類別析構函數只會呼叫基底類別析構函數,可不會呼叫基底類別建構子。你的問題錯了! 2.為什麼會呼叫?衍生類別包含了兩個部分,基底類別部分和衍生類別部分,編譯器幫助我們在呼叫派生類別析構函數的時候自動呼叫基底類別的析構函數,這樣的策略使得我們在完全不用管基類別的實現。方便多了。
析构函数
的主要作用,就是在該類別實例物件不需要的時候,對這個物件進行一些清理作用(主要是記憶體的釋放.)一個基类
,它也是一個類別,它也可以有物件, 所以基底類別的析構函數負責基底類別內部開啟的一些記憶體的清理工作.那麼, 對於
派生类
. 可能會產生一些內存的開銷, 那麼派生類也需要構造函數. 基類只了解基類內部的內存開銷, 派生類只了解派生類自己的內存開銷. 他們之間互不了解. 繼承關係, 多數都是建立在擴充基類的關係上.派生類別豐富了基底類別, 如果派生類別的實例物件在銷毀的時候, 不去自動呼叫基底類別的析構函數, 那麼請問? 基底類別的清理工作誰去做?
基类的内部, 有一些是派生类不了解的.
為了方便,為了安全,為了管理. 所以派生類別的物件銷毀的時候, 繼承機制會分級呼叫各級的析構函數.内存的清理工作必须严格要求. 谁开辟的,谁最后释放.
一人做事兒一人當. 孩子闖了禍, 不應該讓老爹去認錯. 同時繼承關係, 基類有基類的責任, 派生類有派生類的責任. 分工明確了, 不能越俎代庖. 各部門相互協調, 程序才能順暢運作.在衍生類別的析構函數中不用明確地呼叫基底類別的析構函數,因為每個類別只有一個析構函數,編譯器知道如何選擇,無需程式設計師干涉。
另外析構函數的執行順序和建構子的執行順序也剛好相反:
建立衍生類別物件時,建構子的執行順序和繼承順序相同,即先執行基底類別建構函數,再執行派生類別構造函數。
而銷毀派生類別物件時,析構函數的執行順序和繼承順序相反,即先執行衍生類別析構函數,再執行基底類別析構函數。
1.衍生類別析構函數只會呼叫基底類別析構函數,可不會呼叫基底類別建構子。你的問題錯了!
2.為什麼會呼叫?衍生類別包含了兩個部分,基底類別部分和衍生類別部分,編譯器幫助我們在呼叫派生類別析構函數的時候自動呼叫基底類別的析構函數,這樣的策略使得我們在完全不用管基類別的實現。方便多了。