嵌入式學習筆記:C++繼承的三種方式,用實例教會你(ni)
時間:2018-09-05 來源(yuan):未知
c++繼(ji)承是c里面(mian)學(xue)習(xi)比較難的,在這(zhe)里告訴你c++繼(ji)承,從各個方面(mian)來(lai)給你一一擊破難點(dian)。讓你快速學(xue)習(xi)。
面(mian)向對(dui)象程(cheng)序設計中最(zui)重要的(de)一個概(gai)念是繼承(cheng)。繼承(cheng)允許我們依據另一個類(lei)來定(ding)義一個類(lei),這使得創建和維護(hu)一個應用(yong)程(cheng)序變得更容易。這樣(yang)做,也(ye)達到(dao)了(le)重用(yong)代(dai)碼功能和提(ti)高執行時(shi)間的(de)效果。
當創建一(yi)(yi)個(ge)類時,您不需要重新(xin)編寫新(xin)的(de)數據成(cheng)員和(he)成(cheng)員函數,只需指定新(xin)建的(de)類繼承了一(yi)(yi)個(ge)已有的(de)類的(de)成(cheng)員即可(ke)。這(zhe)個(ge)已有的(de)類稱為基類,新(xin)建的(de)類稱為派生類。
如(ru)何實現繼承?
一(yi)(yi)個(ge)類(lei)可以(yi)派(pai)生(sheng)(sheng)自多個(ge)類(lei),這意味著,它(ta)可以(yi)從多個(ge)基(ji)類(lei)繼承數據和函(han)數。定義(yi)一(yi)(yi)個(ge)派(pai)生(sheng)(sheng)類(lei),我們使用一(yi)(yi)個(ge)類(lei)派(pai)生(sheng)(sheng)列表來指定基(ji)類(lei)。類(lei)派(pai)生(sheng)(sheng)列表以(yi)一(yi)(yi)個(ge)或(huo)多個(ge)基(ji)類(lei)命名,形(xing)式如下:
class derivedclass: access­specifier base­class
其中,訪問修飾符(fu) access-specifier 是 public、
protected 或(huo) private 其中的一個,base-class 是之前定(ding)義過的某個類的名稱(cheng)。如(ru)果(guo)未使用(yong)訪(fang)問修飾符 access-specifier,則默認(ren)為(wei)private。
注:
子類也可以稱為派生類,父類可以稱為基(ji)類。
繼承后(hou),子類會完(wan)全繼承父類中(zhong)所有的成(cheng)員變量和成(cheng)員函(han)數(shu)(除父類的構造函(han)數(shu)以外)
public :公(gong)有(you)的成員在任何地方都(dou)可(ke)以訪問
protected:受保護的成員,在類(lei)的作用范圍內可以訪問(wen),友元也(ye)可以訪問(wen),在其派生類(lei)中也(ye)可以訪問(wen),在類(lei)的外部不能訪問(wen)。
private:私有(you)的(de)成員在類的(de)作用(yong)范圍內(nei)可(ke)以(yi)訪問(wen),友元(yuan)也可(ke)以(yi)訪問(wen)。
一個派生(sheng)類(lei)(lei)繼(ji)承了所有(you)的基類(lei)(lei)方法,但下列情況(kuang)除外:
基類(lei)的構(gou)造(zao)函(han)數(shu)、析(xi)構(gou)函(han)數(shu)和拷貝構(gou)造(zao)函(han)數(shu)。
基(ji)類(lei)的重載運(yun)算符。
基類的友元函(han)數。
構(gou)造和(he)析構(gou)的順(shun)序:
子類(lei)(lei)的(de)構造(zao)函數(shu)一定會先調用父類(lei)(lei)的(de)構造(zao)函數(shu),先初始化從父類(lei)(lei)繼承而來的(de)成員變(bian)量(liang)(liang),再調用自己的(de)構造(zao)函數(shu)初始化新增的(de)成員變(bian)量(liang)(liang)。
析(xi)(xi)構(gou)(gou)相(xiang)反(fan),先(xian)調(diao)用子類(lei)的(de)析(xi)(xi)構(gou)(gou)函(han)數釋放(fang)新增內存,再調(diao)用父類(lei)的(de)析(xi)(xi)構(gou)(gou)函(han)數釋放(fang)從父類(lei)繼承而來的(de)部分。
當父類的(de)(de)構造函(han)數(shu)(shu)沒有參(can)數(shu)(shu)的(de)(de)時候,子(zi)類的(de)(de)構造函(han)數(shu)(shu)可(ke)以不主動調用父類的(de)(de)構造函(han)數(shu)(shu),但是父類的(de)(de)構造函(han)數(shu)(shu)依然(ran)會被自動調用。
三(san)種繼承(cheng)方式(shi):
1.公(gong)(gong)有繼(ji)(ji)承(cheng) 父(fu)類(lei)(lei)的(de)公(gong)(gong)有成(cheng)(cheng)員繼(ji)(ji)承(cheng)到子類(lei)(lei)中是(shi)公(gong)(gong)有屬性,父(fu)類(lei)(lei)的(de)保護成(cheng)(cheng)員繼(ji)(ji)承(cheng)到子類(lei)(lei)中是(shi)保護屬性,父(fu)類(lei)(lei)的(de)私(si)有成(cheng)(cheng)員繼(ji)(ji)承(cheng)到子類(lei)(lei)中不可訪(fang)問。
2.保(bao)(bao)護(hu)繼(ji)承(cheng) 父類的公有成(cheng)員繼(ji)承(cheng)到(dao)子(zi)類中是保(bao)(bao)護(hu)屬性,父類的保(bao)(bao)護(hu)成(cheng)員繼(ji)承(cheng)到(dao)子(zi)類中是保(bao)(bao)護(hu)屬性,父類的私有成(cheng)員繼(ji)承(cheng)到(dao)子(zi)類中不可訪(fang)問
3.私(si)有(you)繼承 父類的(de)公有(you)成員繼承到(dao)子類中是私(si)有(you)屬(shu)性,父類的(de)保護成員繼承到(dao)子類中是私(si)有(you)屬(shu)性,父類的(de)私(si)有(you)成員繼承到(dao)子類中不可訪(fang)問
公有成員保護成員私(si)有成員
公(gong)有繼承(cheng)公(gong)有成員(yuan)保護(hu)成員(yuan)不可訪問(wen)成員(yuan)(通過基(ji)類接口訪問(wen))
保(bao)護(hu)繼承保(bao)護(hu)成員保(bao)護(hu)成員不可訪問成員(通過基(ji)類接(jie)口訪問)
私有繼(ji)承私有成(cheng)員(yuan)私有成(cheng)員(yuan)不可訪(fang)問成(cheng)員(yuan)(通過基類接口訪(fang)問)
在(zai)類(lei)的內部:只有父類(lei)的私有成員不能(neng)訪問(wen)。
在(zai)類(lei)的外部(bu):只能訪問(wen)該對(dui)象的公有成員
多層繼承
A繼(ji)(ji)承(cheng)(cheng)(cheng)自B,B繼(ji)(ji)承(cheng)(cheng)(cheng)自C,可以得(de)出(chu),A繼(ji)(ji)承(cheng)(cheng)(cheng)了C,繼(ji)(ji)承(cheng)(cheng)(cheng)具(ju)有傳遞性多(duo)重繼(ji)(ji)承(cheng)(cheng)(cheng)
一個類(lei)繼承自(zi)多個父類(lei)
如何多重繼承?
class 子類(lei)(lei)名 :public 父(fu)類(lei)(lei)1名, public 父(fu)類(lei)(lei)2名...
{
子類成員....
};
多重繼(ji)承構造函數的順序(xu)?
一定先從左到(dao)右依次調用父類的構造(zao)函(han)數,再(zai)調用自己的構造(zao)函(han)數析(xi)構的順序相反。
多重(zhong)繼承(cheng)會引發二義(yi)性(xing),如何解決?
方法1:在調用具有(you)二義性的成員(yuan)函數時,指明函數的作用域,到底是從哪(na)個基類繼承而來的。
方法2:虛繼(ji)承
C++使用虛擬繼承(Virtual Inheritance),解決從不同途徑繼承
來的(de)同名的(de)數(shu)(shu)據(ju)成員在內存中有不(bu)同的(de)拷貝造成數(shu)(shu)據(ju)不(bu)一致問題,
將共同(tong)基類設置為(wei)虛(xu)基類。這時(shi)從不同(tong)的路徑(jing)繼承過(guo)來的同(tong)名數據成員
在內存中(zhong)就只有一(yi)個拷貝,同一(yi)個函(han)數名也只有一(yi)個映射。
繼承的關系
has-a 有什(shen)(shen)么。 組合關(guan)系(xi)不能(neng)構成繼承(cheng)關(guan)系(xi) is-a 是什(shen)(shen)么, 能(neng)構成繼承(cheng)關(guan)系(xi)
like-a 像(xiang)什么一(yi)樣 不能(neng)構成繼(ji)承(cheng)關系(xi) as---a 作為實現手段 不能(neng)構成繼(ji)承(cheng)關系(xi)總結:
當(dang)類中有成員變量(liang)是其他類的(de)對象的(de)時(shi)候(hou),先從上(shang)到下依次(ci)構造對象成
員,再調(diao)用自己的構(gou)造函數。
析構的順序相(xiang)反。
當類(lei)(lei)(lei)中(zhong)既有多重繼承,又(you)有成員變量是其他(ta)類(lei)(lei)(lei)的對象,先(xian)從(cong)左到(dao)右依次調用(yong)父(fu)類(lei)(lei)(lei)構造(zao)函數,再(zai)從(cong)上到(dao)下
依次構造對(dui)象成員,最(zui)后調(diao)用自己的(de)構造函數。

