在我們前面學習過類中的構造函數,以及析構函數,那么自然而然,在繼承關系中,必然是存在著析構和構造著。
一、子類對象的構造
1、問題的引出
如何初始化父類成員?
父類構造函數和子類構造函數有什么關系?
2、子類中的構造函數怎樣初始化父類成員:
子類中也是可以定義構造函數的:
--必須對繼承而來的成員進行初始化,那么怎樣初始化呢?這里有兩種方式:
-直接通過初始化列表或者賦值的方式進行初始化
-調用父類構造函數進行初始化
3、父類構造函數在子類中的調用方式
默認調用
-適用于無參構造函數和使用默認參數的構造函數
顯示調用
-通過初始化列表進行調用
-適用于所有父類構造函數
實踐代碼模板:
代碼實踐:
輸出結果:
注解:通過上面的代碼輸出結果,我們可以發現,子類定義的對象如果沒有沒有傳參,就隱式調用父類的構造函數;當然上面也使用了顯示調用,通過初始列表的就可以看出。
4、構造規則
子類對象在創建時會首先調用父類的構造函數
先執行父類構造函數再執行子類的構造函數
父類構造函數可以被隱式調用或者顯示調用
5、對象創建時構造函數的調用順序
(1)調用父類的構造函數
(2)調用成員變量的構造函數
(3)調用類自身的構造函數
總結:先父母,后客人,再自己
代碼實踐:
輸出結果:
注解:我們可以看到,先定義了一個Child對象,然后最先訪問Object帶參構造函數,然后再是Parent帶參構造函數(說白了就是父類先觸發),然后在子類Child中又包含了組合關系(也就是客人),然后Object類中的帶參構造函數,最后再觸發自身的帶參構造函數。
二、子類對象的析構
1、析構函數的調用順序與構造函數相反
(1)執行自身的析構函數
(2)執行成員變量的析構函數
(3)執行父類的析構函數
代碼實踐:
輸出結果:
三、總結:
子類對象在創建時需要調用父類構造函數進行初始化
先執行父類構造函數然后執行成員的構造函數
父類構造函數顯示調用需要在初始化列表中進行
子類對象在銷毀時需要調用父類析構函數進行清理
析構順序與構造順序對稱相反
-
可編程邏輯
+關注
關注
7文章
517瀏覽量
44181 -
C++
+關注
關注
22文章
2114瀏覽量
73857
發布評論請先 登錄
相關推薦
同樣是函數,在C和C++中有什么區別
C語言中申請的堆內存能不能自動釋放
ostream在c++中的用法
基于OpenHarmony標準系統的C++公共基礎類庫案例:SafeQueue
![基于OpenHarmony標準系統的<b class='flag-5'>C++</b>公共基礎類庫案例:SafeQueue](https://file.elecfans.com/web2/M00/26/21/pYYBAGG5jjSALfrEAAAwAa9Oig8799.png)
基于OpenHarmony標準系統的C++公共基礎類庫案例:SafeStack
![基于OpenHarmony標準系統的<b class='flag-5'>C++</b>公共基礎類庫案例:SafeStack](https://file.elecfans.com/web2/M00/26/21/pYYBAGG5jjSALfrEAAAwAa9Oig8799.png)
C/C++中兩種宏實現方式
鴻蒙OS開發實例:【Native C++】
![鴻蒙OS開發實例:【Native <b class='flag-5'>C++</b>】](https://file1.elecfans.com/web2/M00/C8/31/wKgZomYZMTCAaDv3AAY5x13C324319.jpg)
使用 MISRA C++:2023? 避免基于范圍的 for 循環中的錯誤
![使用 MISRA <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環中的錯誤](https://file1.elecfans.com/web2/M00/A9/66/wKgZomUl7m-AHJX6AABuJjgxs14678.png)
評論