在C++中引入受保護訪問說明符的原理是什麼?一個例子會很有幫助。引入受保護訪問說明符的原理
回答
protected
訪問級別用於類需要與其繼承者一起工作。
例如,想象一個抽象的Shape
類,它可以向外界報告其面積。
不同形狀(如三角形,正方形和圓形)的描述方式不同(角度,邊,半徑),並計算其區域的方式不同。
Shape
類可能有一個公開的getArea()
方法,該方法返回一個保存該區域的私有變量。
設置此變量的最佳方法是protected
方法,稱爲setArea(double)
,該方法將由子類調用。
因此,Circle
會叫setArea(PI * radius * radius)
,Square
會叫setArea(side * side)
等
注意,這不一定是一個好的設計(但它的protected
一個很好的例子)
最好的方法可能會使用虛擬'getArea'方法。 – 2010-06-06 10:48:38
@Matthieu:是的,但這意味着每次調用時都要重新計算該區域。 – SLaks 2010-06-06 11:41:09
不一定,它取決於派生形式來決定是否值得緩存結果。 – 2010-06-06 13:50:57
對於此類問題,我推薦Bjarne Stroustrup的C++的設計和進化。第13.9節描述了受保護成員的演變。
不久後發佈1.0 Cfront的的],馬克·林頓停止了我的辦公室,並提出了存取控制的第三級慷慨激昂[...]他認爲令人信服基於與實際代碼真正的經驗和實例受保護的數據對於設計高效且可擴展的X windows工具包至關重要。 [...]這些都是很好的論據,基本上是讓我相信允許保護成員的論據。 [...]
五年左右的時間後,馬克禁止使用受保護的數據成員的採訪 [提到的X窗口工具箱早些時候],因爲他們已經成爲錯誤的來源。 [...]他們也使維護工作嚴重複雜[...]
受保護的成員被引入到版本1.2。版本2.1中首先描述了受保護的基類。回想起來,我認爲
protected
是一個「良好的論據」和時尚克服我的更好的判斷和我的經驗法則接受新功能的情況。
我完全同意,受保護的數據成員違反了封裝。我只使用受保護的方法。 – 2010-06-06 10:52:47
@Matt:在我看來,類中的字段應該總是隱含地是私有的,沒有任何機制來阻止它,因爲公共字段和受保護字段都會破壞封裝。 – fredoverflow 2010-06-06 11:38:55
我在這裏有非常相同的意見。如果您公開數據成員,則無法強制執行類不變。 – 2010-06-06 13:53:26
- 1. python中的私有公共受保護訪問說明符
- 2. C++受保護的訪問
- 3. 受保護的訪問
- 4. 如何在python中提供此訪問說明符保護?
- 5. 訪問說明符受保護和內部保護在C#之間有什麼區別#
- 6. 訪問說明符
- 7. 在派生類中使用受保護的說明符
- 8. 訪問說明符和右值引用
- 9. C++訪問說明符理解
- 10. 無法訪問在'A'類中聲明的受保護成員
- 11. Java - 訪問說明符
- 12. 關於訪問說明符
- 13. 保護原理
- 14. 免費訪問受保護的成員
- 15. C#訪問受保護的領域
- 16. 訪問Android類的受保護變量
- 17. 無法訪問受保護的成員
- 18. 訪問受保護的繼承
- 19. 訪問受保護的成員
- 20. Withings API - 訪問受保護的資源
- 21. 錯誤訪問受保護的成員
- 22. 訪問受密碼保護的URL
- 23. Ajax訪問受保護的資源
- 24. 無法訪問受保護的成員?
- 25. Python中的「受保護」訪問 - 如何?
- 26. 訪問.htaccess受保護的文件Android
- 27. 如何訪問受保護的成員
- 28. Java:跨包的受保護訪問
- 29. 不能訪問受保護的特性
- 30. 存根訪問受保護的變量
原因似乎是「我們需要做一些事情來使語言比需要的更加複雜,而且比應該更脆弱,這樣顧問可以爲惡劣的工作收取鉅額費用」。 – 2010-06-06 10:11:07