<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 類(lèi)的封裝與繼承

類(lèi)的封裝與繼承

作者: 時(shí)間:2009-12-14 來(lái)源:網(wǎng)絡(luò ) 收藏

上述例程中,對于C而言,有兩個(gè)父類(lèi)B1、B2,有1個(gè)祖父類(lèi)A,從而A、B1、B2、C構成了典型的菱形結構。使用了虛基類(lèi)的菱形結構里,對象的內存布局中只有1個(gè)A,即祖父類(lèi)的部分只有1份,且放在最后面,排放順序是B1+B2+C+A。如果沒(méi)有用虛機制,那么在C對象的內存布局中會(huì )出現2份A部分,這也就是所謂的V型。相應的對象布局為A+B1+A+B2+C。在V型中不能直接從C(即孫子類(lèi))直接轉型到A(即祖父類(lèi))因為在對象的布局中有2份祖父類(lèi)的實(shí)體,分別從B1、B2而來(lái)。編譯器在決議時(shí)會(huì )存在二義性,它不知道轉型后到底用哪一份實(shí)體??梢酝ㄟ^(guò)先轉型到某一父類(lèi),然后再轉型到祖父類(lèi)來(lái)解決。但使用這種方法時(shí),如果改寫(xiě)了祖父類(lèi)的成員變量的內容,runtime不會(huì )同步2個(gè)祖父類(lèi)實(shí)體的狀態(tài),因此可能會(huì )有語(yǔ)義錯誤。
多繼承結構允許1個(gè)對象繼承來(lái)自不同對象的特征,但也會(huì )帶來(lái)新的問(wèn)題。我們看下面的規則。規則10-2-1(推薦): 多繼承層級中,可訪(fǎng)問(wèn)的實(shí)體名稱(chēng)應當是相互獨立、不同的。如果名稱(chēng)含混不清,編譯器將報告名稱(chēng)沖突,同時(shí)不會(huì )武斷生成不符合預期的代碼。但是這種含混不清對于開(kāi)發(fā)者來(lái)說(shuō),并不容易察覺(jué)。當成員函數是虛函數時(shí),還有一個(gè)需要特別注意的地方:通過(guò)explicitly引用基類(lèi)來(lái)解決名稱(chēng)含混的問(wèn)題,將會(huì )去除函數的“虛”特性。對于本條規則也有例外的情況,比如:相關(guān)的重載函數應當看作具有相同的入口。相關(guān)說(shuō)明程序如下:


上述程序定義D時(shí),無(wú)法分辨成員中的count和foo()到底來(lái)自B1還是B2,造成了不必要的困擾。代碼重用的目的是按不同方式重復使用代碼來(lái)實(shí)現類(lèi)、結構、函數等,這就要求代碼必須是通用的,且通用代碼不受使用數據類(lèi)型和操作的影響,即無(wú)論使用什么數據類(lèi)型通用代碼都是不變的。于是C++提出了類(lèi)模板的概念:類(lèi)模版可以為類(lèi)聲明1種模式,使得類(lèi)中的某些數據成員、某些成員函數的參數、某些成員函數的返回值能取任意類(lèi)型。MISRA C++:2008就模板的使用也給出了詳細的規則。
規則14-5-2(強制): 當具有單參數的模版構造函數時(shí),必須聲明拷貝構造函數。
與開(kāi)發(fā)人員預期的不同,模版的構造函數不會(huì )禁止編譯器生成拷貝構造函數。這樣當成員函數要求進(jìn)行深拷 貝的時(shí)候,可能會(huì )導致不正確的拷貝語(yǔ)句被執行。這樣的問(wèn)題往往在程序設計初期不會(huì )引起重視,等到面對莫名其妙的問(wèn)題時(shí),再回過(guò)頭來(lái)尋找原因,只能一籌莫展。如果在程序設計時(shí)就遵循MISRA C++:2008中相關(guān)的規則,自然可以避免這樣的困擾。


4 小 結
本文是學(xué)習MISRA C++系列連載講座之三。從“統籌兼顧”的角度和大家一起學(xué)習討論了MISRA C++:2008中關(guān)于類(lèi)、派生類(lèi)、成員訪(fǎng)問(wèn)的控制、特殊的成員函數以及模版的相關(guān)規則。其中有意思的例子還有很多,限于篇幅,就不一一展開(kāi)敘述了。請繼續關(guān)注本系列講座的第4講:異常機制的使用。


上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞: 繼承 C語(yǔ)言

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>