在C ++中引入受保护的访问说明符背后的理由是什么?一个例子会有所帮助。
答案 0 :(得分:3)
对于这些问题,我推荐Bjarne Stroustrup的 C ++的设计和演变。第13.9节描述了受保护成员的演变。
在[Cfront] 1.0版本发布后不久,Mark Linton在我的办公室停下来并对第三级访问控制提出了热烈的请求[...]他基于真实的经验以及保护数据的真实代码的例子进行了有说服力的论证。对于设计高效且可扩展的X windows工具包至关重要。 [...]这些是很好的论据,基本上是那些说服我允许受保护成员的论点。 [...]
大约五年后,Mark禁止在访谈 [前面提到的X windows工具包]中使用受保护的数据成员,因为它们已经成为bug的来源。 [...]他们也严重地使维护复杂化[...]
受保护的成员被引入版本1.2。受保护的基类首先在版本2.1中描述。回想起来,我认为
protected
是一个案例,其中“好的论据”和时尚克服了我更好的判断和我接受新特征的经验法则。
答案 1 :(得分:2)
当类需要与其继承者一起工作时,使用protected
访问级别。
例如,假设一个抽象的Shape
类可以将其区域报告给外部世界。
不同的形状(如三角形,正方形和圆形)以不同的方式描述(角度,边,半径),并以不同方式计算它们的面积。
Shape
类可能有一个公共getArea()
方法,该方法返回一个保存该区域的私有变量。
设置此变量的最佳方法是名为protected
的{{1}}方法,该方法将由子类调用。
因此,setArea(double)
会调用Circle
,setArea(PI * radius * radius)
会调用Square
等。
请注意,这不一定是一个好的设计(但它是setArea(side * side)
的一个很好的例子)