當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 學(xué)習(xí)筆記 > 嵌入式學(xué)習(xí)筆記:C++繼承的三種方式,用實(shí)例教會你
c++繼承是c里面學(xué)習(xí)比較難的,在這里告訴你c++繼承,從各個(gè)方面來給你一一擊破難點(diǎn)。讓你快速學(xué)習(xí)。
面向?qū)ο蟪绦蛟O(shè)計(jì)中最重要的一個(gè)概念是繼承。繼承允許我們依據(jù)另一個(gè)類來定義一個(gè)類,這使得創(chuàng)建和維護(hù)一個(gè)應(yīng)用程序變得更容易。這樣做,也達(dá)到了重用代碼功能和提高執(zhí)行時(shí)間的效果。
當(dāng)創(chuàng)建一個(gè)類時(shí),您不需要重新編寫新的數(shù)據(jù)成員和成員函數(shù),只需指定新建的類繼承了一個(gè)已有的類的成員即可。這個(gè)已有的類稱為基類,新建的類稱為派生類。
如何實(shí)現(xiàn)繼承?
一個(gè)類可以派生自多個(gè)類,這意味著,它可以從多個(gè)基類繼承數(shù)據(jù)和函數(shù)。定義一個(gè)派生類,我們使用一個(gè)類派生列表來指定基類。類派生列表以一個(gè)或多個(gè)基類命名,形式如下:
class derivedclass: accessspecifier baseclass
其中,訪問修飾符 access-specifier 是 public、
protected 或 private 其中的一個(gè),base-class 是之前定義過的某個(gè)類的名稱。如果未使用訪問修飾符 access-specifier,則默認(rèn)為private。
注:
子類也可以稱為派生類,父類可以稱為基類。
繼承后,子類會完全繼承父類中所有的成員變量和成員函數(shù)(除父類的構(gòu)造函數(shù)以外)
public :公有的成員在任何地方都可以訪問
protected:受保護(hù)的成員,在類的作用范圍內(nèi)可以訪問,友元也可以訪問,在其派生類中也可以訪問,在類的外部不能訪問。
private:私有的成員在類的作用范圍內(nèi)可以訪問,友元也可以訪問。
一個(gè)派生類繼承了所有的基類方法,但下列情況除外:
基類的構(gòu)造函數(shù)、析構(gòu)函數(shù)和拷貝構(gòu)造函數(shù)。
基類的重載運(yùn)算符。
基類的友元函數(shù)。
構(gòu)造和析構(gòu)的順序:
子類的構(gòu)造函數(shù)一定會先調(diào)用父類的構(gòu)造函數(shù),先初始化從父類繼承而來的成員變量,再調(diào)用自己的構(gòu)造函數(shù)初始化新增的成員變量。
析構(gòu)相反,先調(diào)用子類的析構(gòu)函數(shù)釋放新增內(nèi)存,再調(diào)用父類的析構(gòu)函數(shù)釋放從父類繼承而來的部分。
當(dāng)父類的構(gòu)造函數(shù)沒有參數(shù)的時(shí)候,子類的構(gòu)造函數(shù)可以不主動調(diào)用父類的構(gòu)造函數(shù),但是父類的構(gòu)造函數(shù)依然會被自動調(diào)用。
三種繼承方式:
1.公有繼承 父類的公有成員繼承到子類中是公有屬性,父類的保護(hù)成員繼承到子類中是保護(hù)屬性,父類的私有成員繼承到子類中不可訪問。
2.保護(hù)繼承 父類的公有成員繼承到子類中是保護(hù)屬性,父類的保護(hù)成員繼承到子類中是保護(hù)屬性,父類的私有成員繼承到子類中不可訪問
3.私有繼承 父類的公有成員繼承到子類中是私有屬性,父類的保護(hù)成員繼承到子類中是私有屬性,父類的私有成員繼承到子類中不可訪問
公有成員保護(hù)成員私有成員
公有繼承公有成員保護(hù)成員不可訪問成員(通過基類接口訪問)
保護(hù)繼承保護(hù)成員保護(hù)成員不可訪問成員(通過基類接口訪問)
私有繼承私有成員私有成員不可訪問成員(通過基類接口訪問)
在類的內(nèi)部:只有父類的私有成員不能訪問。
在類的外部:只能訪問該對象的公有成員
多層繼承
A繼承自B,B繼承自C,可以得出,A繼承了C,繼承具有傳遞性多重繼承
一個(gè)類繼承自多個(gè)父類
如何多重繼承?
class 子類名 :public 父類1名, public 父類2名...
{
子類成員....
};
多重繼承構(gòu)造函數(shù)的順序?
一定先從左到右依次調(diào)用父類的構(gòu)造函數(shù),再調(diào)用自己的構(gòu)造函數(shù)析構(gòu)的順序相反。
多重繼承會引發(fā)二義性,如何解決?
方法1:在調(diào)用具有二義性的成員函數(shù)時(shí),指明函數(shù)的作用域,到底是從哪個(gè)基類繼承而來的。
方法2:虛繼承
C++使用虛擬繼承(Virtual Inheritance),解決從不同途徑繼承
來的同名的數(shù)據(jù)成員在內(nèi)存中有不同的拷貝造成數(shù)據(jù)不一致問題,
將共同基類設(shè)置為虛基類。這時(shí)從不同的路徑繼承過來的同名數(shù)據(jù)成員
在內(nèi)存中就只有一個(gè)拷貝,同一個(gè)函數(shù)名也只有一個(gè)映射。
繼承的關(guān)系
has-a 有什么。 組合關(guān)系不能構(gòu)成繼承關(guān)系 is-a 是什么, 能構(gòu)成繼承關(guān)系
like-a 像什么一樣 不能構(gòu)成繼承關(guān)系 as---a 作為實(shí)現(xiàn)手段 不能構(gòu)成繼承關(guān)系總結(jié):
當(dāng)類中有成員變量是其他類的對象的時(shí)候,先從上到下依次構(gòu)造對象成
員,再調(diào)用自己的構(gòu)造函數(shù)。
析構(gòu)的順序相反。
當(dāng)類中既有多重繼承,又有成員變量是其他類的對象,先從左到右依次調(diào)用父類構(gòu)造函數(shù),再從上到下
依次構(gòu)造對象成員,最后調(diào)用自己的構(gòu)造函數(shù)。