新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 類的封裝與繼承

        類的封裝與繼承

        作者: 時間:2009-12-14 來源:網絡 收藏

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


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


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


        上一頁 1 2 3 下一頁

        關鍵詞: 繼承 C語言

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 青田县| 瓮安县| 美姑县| 常熟市| 承德县| 龙州县| 广南县| 望都县| 八宿县| 苏州市| 丘北县| 新营市| 雷州市| 黔西县| 洱源县| 武清区| 灯塔市| 龙南县| 登封市| 无棣县| 上饶县| 新宁县| 潍坊市| 济宁市| 铅山县| 泊头市| 南涧| 汕头市| 邹城市| 偏关县| 错那县| 仙游县| 红河县| 慈溪市| 思茅市| 奉新县| 富顺县| 桃园市| 淄博市| 河源市| 仁怀市|