父類的私有成員子類是無法直接調(diào)用的耘斩,這就意味著子類只能間接調(diào)用父類的私有成員没宾,其途徑就是通過父類對子類可見的接口,比如說protected或者public
接口病瞳。以前我以為子類是無法使用父類私有成員的眼俊,這個認(rèn)識有點片面意狠。
子類的對象必然包含父類的對象,并且父類的對象成分是在子類之前構(gòu)造完成的疮胖。而C++是通過成員初始化列表來完成次任務(wù)的环戈,如下圖所示:
如果你沒有在成員初始化列表中顯式地調(diào)用父類構(gòu)造函數(shù),它也會調(diào)用父類的默認(rèn)構(gòu)造函數(shù)澎灸。
此外院塞,子類和父類之間還有兩個關(guān)系。
1性昭、父類的指針或者引用可以指向子類拦止。有趣的是在這種情況下你用這個指針或者引用的成員屬于父類。如下圖所示:
這是為什么糜颠?因為C++規(guī)定指針或者引用的類型必須與被賦值的類型保持一致汹族。
這有什么用?這可以為子類調(diào)用父類的成員其兴。
形參中有父類指針或者引用的函數(shù)既可以供父類對象使用也可以供子類對象使用顶瞒,即子類類型可以轉(zhuǎn)化為父類類型。
但是子類對象不可以賦值給父類對象元旬,如下圖所示:
那么用子類對象去初始化父類對象的實質(zhì)是什么呢榴徐?實質(zhì)上是用子類對象的父類成分而不是全部子類對象,去初始化父類對象法绵。使用父類的指針或者引用指向子類對象也是同理箕速。
它們都用到了COPY賦值操作符或者COPY構(gòu)造函數(shù),因為父類中的形參是父類類型朋譬,子類類型可以隱式地轉(zhuǎn)換成父類類型參與運算盐茎。