新聞中心

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

        類的封裝與繼承

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


        1 從過程到對象――類概念的引入
        真實世界是由“對象”組成的,無論是動物、植物、工廠還是機器等,都是根據它們的特征,細分出來的對象類別。盡管在軟件設計時,更多時候我們面對的是經過高度抽象化的模型,但最終需要解決的還是真實世界中的問題。因此,如果能夠在軟件設計中按照對象來進行建模,將更加契合真實世界的情況,有利于解決高度復雜的實際問題。典型的過程化程序設計語言,如,其程序設計更傾向于面向過程,以函數為基本單位。這在自頂向下設計方法深入人心的今天,往往有些力不從心,因為它很難恰如其分地模擬真實世界。
        對于C++語言來說,設計的基本單位是類。類是邏輯上相關的函數與數據的封裝,它是對所要處理的問題的抽象描述。引入了類概念的面向對象程序設計語言C++具有更高的代碼集成度,從而更適合用于大型復雜程序的開發。而由類產生的基類、、派生、模板等概念,更是極大地豐富了軟件工程師解決問題的手段。如此強大的概念,如若使用不當,必然帶來許多意想不到的隱患。為此MISRA C++:2008中專門討論了與類使用相關的問題,簡單舉例如下。
        規則10-1-3(強制): 同一層級的某個基類不允許既是虛基類又是非虛基類。
        這是因為,如果一個基類在多重層次中既是虛類型,又是非虛類型,則在派生出來的相應對象中將至少有2個該基類的子對象拷貝。這可能與開發人員的理解不一致。為了更好說明這個問題,請看下面的程序:

        本文引用地址:http://www.104case.com/article/173524.htm


        上述程序中,由于B1、B2是對A的public virtual,而B3是對A的public繼承。因此,對于C而言,將保有A的2個子對象拷貝,造成不必要的冗繁,并隱含造成開發人員誤解的危險因素。所以,雖然這段程序在語法上是沒有錯誤的,但是出于程序安全性角度的考慮,這種使用方法被MISRA C++:2008所禁止。
        我們知道,通過將數據(屬性)和函數(行為)封裝在稱為對象的包中,可以實現數據和函數的緊密聯系,構成對象對信息的隱藏性。這樣,盡管對象知道怎樣通過定義好的接口實現相互的通信,但是對象通常并不知道其他對象是怎樣實現的,對象的細節隱藏在對象的內部。而同一類對象則具有相同的特點,新建立的對象通過繼承現有類的特征而派生出來,同時可以包含各自獨有的特點。
        也就是說,“類”很好地解決了2個問題:程序模塊化封裝的實現,以及合理提高代碼的利用率。對于軟件設計者之外的用戶而言,每一個對象都是給出了特定接口的“黑盒子”;而對于特定的數據結構,經過單一定義之后,就可以借用繼承主體、修改細節的手段,來實現重復利用。如此高效的統籌兼顧,源于“類”這個嶄新概念的引入。然而這種高效也需要嚴格的規范來保證,否則會帶來意想不到的隱患。為此MISRA C++:2008從類、派生類、成員訪問的控制、特殊的成員函數以及模板這幾個方面進行了詳細的討論,并出于安全角度考慮,提出了一系列規則。下面就結合MISRA C++:2008中的相關規則,對這2個問題作進一步闡述。


        2 統――數據與代碼的封裝
        對象的獨立性是通過封裝實現的,這是指將抽象得到的數據成員和代碼成員相結合,形成一個統一的有機整體,也就是說,將數據與操作數據的行為進行有機的結合、統一。
        通過封裝,一部分成員作為類與外部的接口,其他成員則被很好地隱蔽起來,以實現對數據訪問權限的合理控制,使程序中不同部分之間的相互影響減小到最低。這樣可以達到增強安全性和簡化程序編寫工作的目的。但是在進行封裝時,疏忽一些細節可能會得到與程序設計者初衷相去甚遠的結果,看下面的例子。
        規則9-3-1(強制): 常量類型的成員函數不允許返回非常量類型的指針或對類數據的引用。
        當對象被聲明為常量型的類時,只有該類的常量成員函數能被人們調用。當調用常量成員函數時,人們一般認為將不會改變對象的狀態。然而,當常量類型的函數返回1個指向類數據的非常量指針或者對類數據的引用時,理論上將允許改變對象的狀態。這是程序設計者不希望看到的。
        作為保護數據、實現模塊化編程的手段,一個完全無法被外部訪問的“封裝”是沒有意義的。因此在利用封裝來限制對對象的修改操作時,必須留出必要的“接口”。這些接口通常必須以對象的成員函數的形式給出,否則可能會破壞封裝的效果。再看下面的例子。
        規則9-3-2(強制): 成員函數不允許返回對于類數據的非常量的旬柄。
        利用類的成員函數構建類的訪問接口時,可以就對象狀態是如何被修改的保留更多的控制能力,同時可以實現在對類進行維護時不會受到用戶的影響。返回類數據的句柄,將使得用戶可以不經過類的接口而對類的狀態進行修改,從而破壞了封裝。


        上一頁 1 2 3 下一頁

        關鍵詞: 繼承 C語言

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 德兴市| 房山区| 双牌县| 清镇市| 石泉县| 巨鹿县| 鄂托克旗| 志丹县| 西林县| 中卫市| 通许县| 旬阳县| 中西区| 浦城县| 四会市| 江陵县| 汉源县| 台山市| 大新县| 九寨沟县| 新野县| 广丰县| 察哈| 兴隆县| 天全县| 宿迁市| 固安县| 理塘县| 凌海市| 香港 | 泊头市| 泰州市| 桦川县| 格尔木市| 奉新县| 金沙县| 婺源县| 安乡县| 行唐县| 吉水县| 开封县|