2010-06-06 75 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