<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ò ) 收藏


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

本文引用地址:http://dyxdggzs.com/article/173524.htm


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


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


上一頁(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>