2010-06-06 72 views
5

在C++中引入受保護訪問說明符的原理是什麼?一個例子會很有幫助。引入受保護訪問說明符的原理

+1

原因似乎是「我們需要做一些事情來使語言比需要的更加複雜,而且比應該更脆弱,這樣顧問可以爲惡劣的工作收取鉅額費用」。 – 2010-06-06 10:11:07

回答

2

protected訪問級別用於類需要與其繼承者一起工作。

例如,想象一個抽象的Shape類,它可以向外界報告其面積。

不同形狀(如三角形,正方形和圓形)的描述方式不同(角度,邊,半徑),並計算其區域的方式不同。

Shape類可能有一個公開的getArea()方法,該方法返回一個保存該區域的私有變量。
設置此變量的最佳方法是protected方法,稱爲setArea(double),該方法將由子類調用。

因此,Circle會叫setArea(PI * radius * radius)Square會叫setArea(side * side)

注意,這不一定是一個好的設計(但它的protected一個很好的例子)

+1

最好的方法可能會使用虛擬'getArea'方法。 – 2010-06-06 10:48:38

+0

@Matthieu:是的,但這意味着每次調用時都要重新計算該區域。 – SLaks 2010-06-06 11:41:09

+2

不一定,它取決於派生形式來決定是否值得緩存結果。 – 2010-06-06 13:50:57

3

對於此類問題,我推薦Bjarne Stroustrup的C++的設計和進化。第13.9節描述了受保護成員的演變。

不久後發佈1.0 Cfront的的],馬克·林頓停止了我的辦公室,並提出了存取控制的第三級慷慨激昂[...]他認爲令人信服基於與實際代碼真正的經驗和實例受保護的數據對於設計高效且可擴展的X windows工具包至關重要。 [...]這些都是很好的論據,基本上是讓我相信允許保護成員的論據。 [...]

五年左右的時間後,馬克禁止使用受保護的數據成員的採訪 [提到的X窗口工具箱早些時候],因爲他們已經成爲錯誤的來源。 [...]他們也使維護工作嚴重複雜[...]

受保護的成員被引入到版本1.2。版本2.1中首先描述了受保護的基類。回想起來,我認爲protected是一個「良好的論據」和時尚克服我的更好的判斷和我的經驗法則接受新功能的情況。

+2

我完全同意,受保護的數據成員違反了封裝。我只使用受保護的方法。 – 2010-06-06 10:52:47

+0

@Matt:在我看來,類中的字段應該總是隱含地是私有的,沒有任何機制來阻止它,因爲公共字段和受保護字段都會破壞封裝。 – fredoverflow 2010-06-06 11:38:55

+1

我在這裏有非常相同的意見。如果您公開數據成員,則無法強制執行類不變。 – 2010-06-06 13:53:26