2020-03-21【C++復習2 繼承】

引用

  1. 用必須在定義的同時初始化,并且以后也要從一而終,不能再引用其它數(shù)據(jù),這有點類似于常量(const 變量)。

  2. 如果讀者不希望通過引用來修改原始的數(shù)據(jù),那么可以在定義時添加 const 限制,形式為:const type &name = value;也可以是:type const &name = value;

  3. 在將引用作為函數(shù)返回值時應該注意一個小問題,就是不能返回局部數(shù)據(jù)(例如局部變量、局部對象、局部數(shù)組等)的引用,因為當函數(shù)調(diào)用完成后局部數(shù)據(jù)就會被銷毀,有可能在下次使用時數(shù)據(jù)就不存在了,C++ 編譯器檢測到該行為時也會給出警告。

繼承派生

class 派生類名:[繼承方式] 基類名{
派生類新增加的成員
};

  1. 繼承方式限定了基類成員在派生類中的訪問權(quán)限,包括 public(公有的)、private(私有的)和 protected(受保護的)。此項是可選項,如果不寫,默認為 private(成員變量和成員函數(shù)默認也是 private)。

  2. 繼承方式中的 public、protected、private 是用來指明基類成員在派生類中的最高訪問權(quán)限的。 不管繼承方式如何,基類中的 private 成員在派生類中始終不能使用(不能在派生類的成員函數(shù)中訪問或調(diào)用)

  3. 基類的 private 成員不能在派生類中使用,并不是基類的 private 成員不能被繼承。實際上,基類的 private 成員是能夠被繼承的,并且(成員變量)會占用派生類對象的內(nèi)存,它只是在派生類中不可見,導致無法使用罷了。private 成員的這種特性,能夠很好的對派生類隱藏基類的實現(xiàn),以體現(xiàn)面向?qū)ο蟮姆庋b性。

4.使用 using 關(guān)鍵字可以改變基類成員在派生類中的訪問權(quán)限,using 只能改變基類中 public 和 protected 成員的訪問權(quán)限,不能改變 private 成員的訪問權(quán)限,因為基類中 private 成員在派生類中是不可見的,根本不能使用,所以基類中的 private 成員在派生類中無論如何都不能訪問。

  1. 如果派生類中的成員(包括成員變量和成員函數(shù))和基類中的成員重名,那么就會遮蔽從基類繼承過來的成員。所謂遮蔽,就是在派生類中使用該成員(包括在定義派生類時使用,也包括通過派生類對象訪問該成員)時,實際上使用的是派生類新增的成員,而不是從基類繼承來的?;愔械某蓡T仍然可以訪問,不過要加上類名和域解析符

  2. 基類成員函數(shù)和派生類成員函數(shù)不會構(gòu)成重載,如果派生類有同名函數(shù),那么就會遮蔽基類中的所有同名函數(shù),不管它們的參數(shù)是否一樣。

  3. 基類的成員函數(shù)可以被繼承,可以通過派生類的對象訪問,但這僅僅指的是普通的成員函數(shù),類的構(gòu)造函數(shù)不能被繼承,在派生類的構(gòu)造函數(shù)中調(diào)用基類的構(gòu)造函數(shù)基類構(gòu)造函數(shù)不會被繼承,不能當做普通的成員函數(shù)來調(diào)用。換句話說,只能將基類構(gòu)造函數(shù)的調(diào)用放在函數(shù)頭部,不能放在函數(shù)體中。。函數(shù)頭部是對基類構(gòu)造函數(shù)的調(diào)用,而不是聲明,所以括號里的參數(shù)是實參,它們不但可以是派生類構(gòu)造函數(shù)參數(shù)列表中的參數(shù),還可以是局部變量、常量等

  4. 在設(shè)計派生類時,對繼承過來的成員變量的初始化工作也要由派生類的構(gòu)造函數(shù)完成,但是大部分基類都有 private 屬性的成員變量,它們在派生類中無法訪問,更不能使用派生類的構(gòu)造函數(shù)來初始化。

  5. 派生類構(gòu)造函數(shù)總是先調(diào)用基類構(gòu)造函數(shù)再執(zhí)行其他代碼(包括參數(shù)初始化表以及函數(shù)體中的代碼)

  6. 派生類構(gòu)造函數(shù)中只能調(diào)用直接基類的構(gòu)造函數(shù),不能調(diào)用間接基類的。

  7. 定義派生類構(gòu)造函數(shù)時最好指明基類構(gòu)造函數(shù);如果不指明,就調(diào)用基類的默認構(gòu)造函數(shù)(不帶參數(shù)的構(gòu)造函數(shù));如果沒有默認構(gòu)造函數(shù),那么編譯失敗。

  8. 多繼承下基類構(gòu)造函數(shù)的調(diào)用順序和和它們在派生類構(gòu)造函數(shù)中出現(xiàn)的順序無關(guān),而是和聲明派生類時基類出現(xiàn)的順序相同

  9. 當兩個或多個基類中有同名的成員時,如果直接訪問該成員,就會產(chǎn)生命名沖突,編譯器不知道使用哪個基類的成員。這個時候需要在成員名字前面加上類名和域解析符::,以顯式地指明到底使用哪個類的成員,消除二義性。

虛繼承和虛基類

  1. 虛繼承的目的是讓某個類做出聲明,承諾愿意共享它的基類。其中,這個被共享的基類就稱為虛基類(Virtual Base Class)
    使用虛繼承解決菱形繼承中的命名沖突問題

    必須在虛派生的真實需求出現(xiàn)前就已經(jīng)完成虛派生的操作。在上圖中,當定義 D 類時才出現(xiàn)了對虛派生的需求,但是如果 B 類和 C 類不是從 A 類虛派生得到的,那么 D 類還是會保留 A 類的兩份成員。虛派生只影響從指定了虛基類的派生類中進一步派生出來的類,它不會影響派生類本身

  2. 在虛繼承中,虛基類是由最終的派生類初始化的,換句話說,最終派生類的構(gòu)造函數(shù)必須要調(diào)用虛基類的構(gòu)造函數(shù)。對最終的派生類來說,虛基類是間接基類,而不是直接基類。這跟普通繼承不同,在普通繼承中,派生類構(gòu)造函數(shù)中只能調(diào)用直接基類的構(gòu)造函數(shù),不能調(diào)用間接基類的。

  3. 虛繼承時構(gòu)造函數(shù)的執(zhí)行順序與普通繼承時不同:在最終派生類的構(gòu)造函數(shù)調(diào)用列表中,不管各個構(gòu)造函數(shù)出現(xiàn)的順序如何,編譯器總是先調(diào)用虛基類的構(gòu)造函數(shù),再按照出現(xiàn)的順序調(diào)用其他的構(gòu)造函數(shù);而對于普通繼承,就是按照構(gòu)造函數(shù)出現(xiàn)的順序依次調(diào)用的。

向上轉(zhuǎn)型

  1. 賦值的本質(zhì)是將現(xiàn)有的數(shù)據(jù)寫入已分配好的內(nèi)存中,對象的內(nèi)存只包含了成員變量,所以對象之間的賦值是成員變量的賦值,成員函數(shù)不存在賦值問題。

    將派生類對象賦值給基類對象時,會舍棄派生類新增的成員
    可以發(fā)現(xiàn),即使將派生類對象賦值給基類對象,基類對象也不會包含派生類的成員,所以依然不同通過基類對象來訪問派生類的成員 對象之間的賦值不會影響成員函數(shù),也不會影響 this 指針

  2. 轉(zhuǎn)換關(guān)系是不可逆的,只能用派生類對象給基類對象賦值,而不能用基類對象給派生類對象賦值。理由很簡單,基類不包含派生類的成員變量,無法對派生類的成員變量賦值。同理,同一基類的不同派生類對象之間也不能賦值。

  3. 將派生類指針賦值給基類指針時,通過基類指針只能使用派生類的成員變量,但不能使用派生類的成員函數(shù),

  4. 編譯器通過指針來訪問成員變量,指針指向哪個對象就使用哪個對象的數(shù)據(jù);編譯器通過指針的類型來訪問成員函數(shù),指針屬于哪個類的類型就使用哪個類的函數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容