<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          類的封裝與繼承

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

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


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


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


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

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

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();