柚子快報邀請碼778899分享:【C++】繼承
柚子快報邀請碼778899分享:【C++】繼承
文章目錄
繼承的介紹基類和派生類對象的賦值轉(zhuǎn)換繼承中的作用域派生類的默認構(gòu)造函數(shù)繼承與友元繼承與靜態(tài)成員復(fù)雜的菱形繼承和菱形虛擬繼承繼承的總結(jié)和反思
繼承的介紹
繼承的概念: 繼承機制是面向?qū)ο蟪绦蛟O(shè)計使代碼可以復(fù)用最重要的手段,它允許程序員在保持原有類特性的基礎(chǔ)上進行擴展,增加功能,產(chǎn)生新的類,稱為派生類。繼承呈現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計的層次結(jié)構(gòu),體現(xiàn)了由簡單到復(fù)雜的認知過程。以前所接觸的復(fù)用都是函數(shù)復(fù)用,繼承是類設(shè)計層次的復(fù)用。
繼承基類成員訪問方式的變化 要點:
基類private成員在派生類中不管以什么方式繼承都是不可見的如果要基類成員在類外不能被訪問,但是在派生類中可以被訪問,就定義為protected使用關(guān)鍵字class的默認繼承方式為private,使用關(guān)鍵字struct的默認繼承方式為public,不過,最好顯示的寫出繼承方式。在實際運用中一般都使用public繼承,幾乎不使用private/protected繼承。
基類和派生類對象的賦值轉(zhuǎn)換
向上轉(zhuǎn)換!
派生類的對象可以賦值給 基類的對象/基類的指針/基類的引用。這里有個形象的說法叫做切片或者切割,意思就是把基類的那一部分切下來賦值過去基類對象不能給派生類對象賦值基類的指針或者引用可以通過強制類型轉(zhuǎn)換賦值給派生類的指針或者引用。但必須基類的指針指向派生類對象時才是安全的。
繼承中的作用域
在子類和父類中都有自己的作用域如果子類和父類有同名成員,那么在訪問子類的對應(yīng)同名成員時,會屏蔽父類的同名成員,這種情況叫做隱藏,也叫重定義。注意,如果函數(shù)名相同,函數(shù)參數(shù)不同,構(gòu)成的也是隱藏,而不是重載(重載需要在同一作用域內(nèi))在實際的繼承體系中最好不要定義實際的同名成員
派生類的默認構(gòu)造函數(shù)
派生類的構(gòu)造函數(shù)會調(diào)用基類的構(gòu)造函數(shù)對基類的那一部分成員進行初始化。如果基類沒有默認構(gòu)造函數(shù),那么要在派生類構(gòu)造函數(shù)的初始化列表顯式調(diào)用。 派生類的拷貝構(gòu)造函數(shù)必須調(diào)用基類的拷貝構(gòu)造函數(shù)對基類成員進行初始化 派生類的賦值重載函數(shù)必須調(diào)用基類的賦值重載函數(shù) 派生類的析構(gòu)函數(shù)完成后會自動調(diào)用基類的析構(gòu)函數(shù)對基類成員進行清理 派生類對象的初始化先調(diào)用基類的構(gòu)造在調(diào)用派生類的構(gòu)造 因為后續(xù)的一些場景析構(gòu)函數(shù)需要構(gòu)成重寫,重寫的條件就是函數(shù)名相同,編譯器會將析構(gòu)函數(shù)的函數(shù)名都處理成destructor。所以在不加virtual的情況下,子類的析構(gòu)函數(shù)和父類的析構(gòu)函數(shù)構(gòu)成隱藏的關(guān)系
繼承與友元
友元關(guān)系不能繼承,也就是說父類的友元不能訪問基類的私有和保護成員。
繼承與靜態(tài)成員
stati成員不能繼承。如果基類定義了一個static成員,則整個繼承體系只有這一個成員。無論后續(xù)派生出多少類,都只有一個static成員實例。
復(fù)雜的菱形繼承和菱形虛擬繼承
菱形繼承存在二義性問題和數(shù)據(jù)的冗余問題 這樣二義性的問題解決了,但數(shù)據(jù)冗余問題卻沒有解決。 使用虛擬繼承的方法可以解決數(shù)據(jù)冗余問題。
下面討論虛擬繼承的原理
下面是菱形繼承的虛擬對象模型:可以分析得出D對象將A放到了對象組成的最先,這個A同時屬于B和C,那么B和C如何找到公共的A呢?這里是通過B和C的兩個指針,指向的一張表。這兩個指針叫做虛基表指針,這兩個表叫做虛基表。虛基表中存了偏移量,通過偏移量可以找到A。
繼承的總結(jié)和反思
1,很多人說C++語法復(fù)雜,繼承就是一個體現(xiàn)。有了多繼承,就有了菱形繼承和菱形虛擬繼承。實際應(yīng)用中不要設(shè)計出多繼承和菱形繼承,否則程序在復(fù)雜性和效率上都有一定的損失 2,多繼承可以說是C++的缺陷之一,后來很多的語言都沒有多繼承,比如Java。 3,繼承和組合
繼承允許你根據(jù)基類的實現(xiàn)來定義派生類的實現(xiàn)。這種通過生成派生類的復(fù)用通常被稱為“白箱復(fù)用”。術(shù)語“白箱”是相對可視性而言:在繼承方式中,基類的內(nèi)部細節(jié)對派生類可見?;鶎右欢ǔ绦蚱茐牧嘶惖姆庋b,基類的改變,對派生類有很大影響。派生類和基類間的依賴關(guān)系很強,耦合度高。對象組合是類繼承之外的另一種復(fù)用選擇。新的更復(fù)雜的接口功能可以通過組裝或者組合對象來獲得。對象組合要求被組合的對象具有良好定義的接口。這種復(fù)用的風格稱為黑箱復(fù)用,對象內(nèi)部的細節(jié)是不可見的。對象只以“黑箱”的方式出現(xiàn),組合類之間沒有很強的依賴關(guān)系,耦合度低。優(yōu)先使用對象組合有利于你保持每個類被封裝。實際進程多去用組合。組合的耦合度低,代碼的維護性好。不過繼承也有用武之地的,有些關(guān)系適合繼承,另外要實現(xiàn)多態(tài),也必須要繼承。類之間的關(guān)系能用組合就用組合,其次再考慮繼承。
柚子快報邀請碼778899分享:【C++】繼承
參考鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。