什么是 protected(保护) 权限?
到目前为止,我们学习的访问控制关键字只有 private 和 public,这两个关键字可以控制类成员的访问权限。其实还存在另一个访问控制关键字 —— protected。
protected 权限特点:
- protected 与 private 关键字类似,在类外只能通过 public 类成员函数来访问类的 protected 数据成员和成员函数。
- protected 与 private 区别只有在派生类中才会体现出来。派生类的成员可以直接访问基类的保护成员,但不能直接访问基类的私有成员。
因此,对于外部世界来说,类的保护成员与私有成员是一样的,都不能直接访问,必须通过公有成员函数间接访问;但对于派生类来说,保护成员与公有成员是一样的,都可以在派生类中直接访问。
class A {protected:int value;public:int getValue() const { return value; }bool setValue(int v) { value = v; return true; }};class B : public A {public:void f(int v);};void B::f(int v) {value = v;}
类 A 中将 value 声明为 protected,在其派生类 B 中可以在 f() 函数中直接访问基类的 protected 成员(value)。如果在类 A 中将 value 声明为 private,则在派生类 B 中只能使用类 A 提供的 public 函数间接访问。
使用保护数据成员可以简化派生类代码的编写工作,但存在设计缺陷。例如上例中,类 A 的设计是希望数据成员 value 只能通过 setValue() 修改。但对于类 B,f() 函数将忽略类 A 对 value 数据的保护。
因此,对于类的数据成员推荐使用私有访问控制,在派生类中通过基类的公有函数访问基类数据。保护访问控制更多的是用于成员函数上,它让派生类能够访问公众不能使用的内部函数。
