什么是 protected(保护) 权限?

到目前为止,我们学习的访问控制关键字只有 private 和 public,这两个关键字可以控制类成员的访问权限。其实还存在另一个访问控制关键字 —— protected。
protected 权限特点:

  • protected 与 private 关键字类似,在类外只能通过 public 类成员函数来访问类的 protected 数据成员和成员函数。
  • protected 与 private 区别只有在派生类中才会体现出来。派生类的成员可以直接访问基类的保护成员,但不能直接访问基类的私有成员。

因此,对于外部世界来说,类的保护成员与私有成员是一样的,都不能直接访问,必须通过公有成员函数间接访问;但对于派生类来说,保护成员与公有成员是一样的,都可以在派生类中直接访问。

  1. class A {
  2. protected:
  3. int value;
  4. public:
  5. int getValue() const { return value; }
  6. bool setValue(int v) { value = v; return true; }
  7. };
  8. class B : public A {
  9. public:
  10. void f(int v);
  11. };
  12. void B::f(int v) {
  13. value = v;
  14. }

类 A 中将 value 声明为 protected,在其派生类 B 中可以在 f() 函数中直接访问基类的 protected 成员(value)。如果在类 A 中将 value 声明为 private,则在派生类 B 中只能使用类 A 提供的 public 函数间接访问。
使用保护数据成员可以简化派生类代码的编写工作,但存在设计缺陷。例如上例中,类 A 的设计是希望数据成员 value 只能通过 setValue() 修改。但对于类 B,f() 函数将忽略类 A 对 value 数据的保护。
因此,对于类的数据成员推荐使用私有访问控制,在派生类中通过基类的公有函数访问基类数据。保护访问控制更多的是用于成员函数上,它让派生类能够访问公众不能使用的内部函数。