對書本上繼承與派生部分的描述一直看得不是很明白,做個小實驗,增進理解:
類的繼承:
派生類可以繼承基類的所有成員。
在派生類中,成員可以按訪問屬性劃分為一下4中:
(1)不可訪問的成員。這是從基類私有成員繼承而來的,派生類或是建立派生類對象的模塊都沒有辦法訪問到它們。如果從派生類繼續派生新類,也是無法訪問到的。
(2)私有成員。這裡可以包括從基類繼承過來的成員以及新增加的成員,在派生類內部可以訪問,但是從建立派生類對象的模塊中無法訪問,繼續派生,就變成了新的派生類中不可訪問成員。
(3)保護成員。可能是新增加的也可能是從基類繼承過來的,派生類內部可以訪問,建立派生類對象的模塊無法訪問,進一步派生,在新的派生類中可能成為私有成員或者保護成員。
(4)公有成員。派生類、建立派生類的模塊都可以訪問,繼續派生,可能是新派生類中的私有、保護或者公有成員。
內嵌類及其初始化:
類的初始化函數定義中可以添加內嵌對象成員的初始化列表。也可以添加基類的構造函數。
當創建類的對象時,如果這個類具有內嵌對象成員,那麼各個內嵌對象將首先被自動創建。因此,在創建對象時既要對本類的基本類型數據成員進行初始化,又要對內嵌對象成員進行初始化。對基本類型的數據成員也可以這樣初始化。
在創建一個組合類的對象時,不僅它自身的構造函數的函數體將被執行,而且還將調用其內嵌對象的構造函數。這時構造函數的調用順序如下:
(1)調用內嵌對象的構造函數,調用順序按照內嵌對象在組合類的定義中出現的次序。而內嵌對象在構造函數的初始化列表中出現的順序與內嵌對象構造函數的調用順序無關。
(2)執行本類構造函數的函數體。
如果有些內嵌對象沒有出現在構造函數的初始化列表中,那麼在第一步中,該內嵌對象的默認構造函數將被執行
有些數據成員的初始化必須在構造函數的初始化列表中進行,這些數據成員包括兩大類,一類是那些沒有默認構造函數的內嵌對象——因為這類對象初始化時必須提供參數,另一類是引用類型的數據成員——因為引用型變量必須在初始化時綁定引用的對象。如果一個類包括這兩類成員,那麼編譯器不能夠為這個類提供隱含的默認構造函數,這時必須編寫顯式的構造函數,並且在每個構造函數的初始化列表中至少為這兩類數據成員初始化。