18 December 2022

C++ 核心指南目录

C.133: Avoid protected data

理由

protected 数据是复杂和错误的源泉。 protected 数据把类的不变式约束弄得更复杂。 protected 数据违反了“不要把数据放在基类”的指导方针,往往会导致需要处理虚继承关系。

例子

class Shape {
public:
    // ... interface functions ...
protected:
    // data for use in derived classes:
    Color fill_color;
    Color edge_color;
    Style st;
};

这样,就要求每个 Shape 的继承类都要能正确处理 protected 的数据。尽管这种做法很流行,但是会导致维护困难。在大的类层级结构中,维护使用 protected 数据的一致性很困难,因为在大量的类中隐藏着大量的代码要修改。能够接触这些数据的类也是开放的:任何人都可以继承一个新类,去操作这些 protected 数据。我们往往对所有的类进行检查,所以修改这些类变得很困难。没有任何不变式约束这些 protected 数据,更像是一组全局变量。 protected 数据事实上成了很大一片代码的全局变量。

注意

protected 数据经常看起来能够通过继承提供很多优化。然而,事实上,你经常得到的是无原则的修改和错误。请使用 private 私有数据,并强化不变式约束。另一个更好的改进方法,就是使用接口,不要添加数据。

注意

protected 成员函数没问题。

强化

  • 标注使用了 protected 数据的类