網(wǎng)站首頁 編程語言 正文
前言:
子類需要編寫自己的構(gòu)造函數(shù)和析構(gòu)函數(shù),需要注意的是,子類只負責(zé)對新增的成員進行初始化和掃尾編寫構(gòu)造和析構(gòu)函數(shù),父類成員的初始化和掃尾工作由父類的構(gòu)造函數(shù)和析構(gòu)函數(shù)完成。
無論何種類型的繼承方式,子類都無權(quán)訪問父類的所有成員,所以子類對父類的初始化需要父類的構(gòu)造函數(shù)完成。此時,子類的構(gòu)造函數(shù)必須提供父類構(gòu)造函數(shù)所需的參數(shù)。
子類構(gòu)造函數(shù)的語法如下:
子類::子類(全部參數(shù)表):父類1(父類1參數(shù)表),父類2(父類2參數(shù)表)
? ? ? ...對象成員1(對象成員1參數(shù)表),對象成員2(對象成員2參數(shù)表)
其中,“全部參數(shù)表”中包含“所有父類所需參數(shù)”和“子類新增成員所需參數(shù)”;對象成員表示子類新增的對象成員(某些外部類的對象作為子類成員)。
必須指出,子類首先調(diào)用父類的構(gòu)造函數(shù),然后才調(diào)用自身的構(gòu)造函數(shù);如果子類含有多個構(gòu)造函數(shù),那么按照子類繼承各個父類時的聲明順序,來調(diào)用各個父類的構(gòu)造函數(shù)。
下面定義了X、Y和Z三個類,然后Point類繼承這三個類:
class X { public: ?? ?X(int value) { printf("init X %d \n", value); } }; class Y { public: ?? ?Y(int value) { printf("init Y %d \n", value); } }; class Z { public: ?? ?Z() { printf("init Z \n"); } }; class Point: public X, public Y , public z{ public: ?? ?Point(int value_x, int value_y, int value_point):X(value_x),Y(value_y) { ?? ??? ?printf("init Point %d \n", value_point); ?? ?} };
可以看出,Point
類的構(gòu)造函數(shù)“全部參數(shù)表”中給出了“父類所需參數(shù)”和“本類成員所需參數(shù)”(此例中Point類沒有對象成員),并以初始化列表的方式對各個父類進行初始化。下面定義Point
類對象,
來查看子類和父類構(gòu)造函數(shù)的調(diào)用順序:
int main() { ?? ?Point p(333, 666, 999); } // 得到下面的結(jié)果 init X 333 init Y 666 init Z init Point 999
再次證明:因為Point
聲明時先繼承X類后繼承Y類,所以先調(diào)用X構(gòu)造函數(shù)后調(diào)用Y構(gòu)造函數(shù),最后調(diào)用Z類構(gòu)造函數(shù)。
此外,某個父類構(gòu)造函數(shù)不需要參數(shù)時,子類構(gòu)造函數(shù)可以不考慮此父類,系統(tǒng)會調(diào)用該父類默認的構(gòu)造函數(shù)(比如上述的Z類)。如果某個父類即含有需要參數(shù)的構(gòu)造函數(shù),又含有不需參數(shù)的構(gòu)造函數(shù),程序員可自行決定使用哪一個。
通過總結(jié)可以得出,子類構(gòu)造函數(shù)代碼運行次序如下:
- 首先,按照父類在繼承聲明時的次序調(diào)用對應(yīng)構(gòu)造函數(shù);
- 其次,按照子類的對象成員在子類中聲明次序?qū)ζ溥M行初始化;
- 最后,執(zhí)行子類構(gòu)造函數(shù)體;
原文鏈接:https://zhuanlan.zhihu.com/p/106920426
相關(guān)推薦
- 2022-10-06 C++?pimpl機制詳細講解_C 語言
- 2023-01-12 C語言求字符串長度的四種方法實例代碼_C 語言
- 2022-05-29 Android?App如何防止抓包_Android
- 2022-04-02 Python字符串與正則表達式詳細介紹_python
- 2022-04-28 python實用的快捷語法技巧大全_python
- 2022-01-08 出現(xiàn)WARN org.springframework.web.servlet.PageNotFoun
- 2022-04-08 從頭學(xué)習(xí)C語言之for語句和循環(huán)嵌套_C 語言
- 2022-09-29 Go語言select語句用法示例_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支