访问控制 protected
我们之前介绍了 public 和 private 关键字, 但除了这两个之外, 还存在另外一个控制权限的关键字, 叫做 protected.
关键字 protected 与 private 相似, 在类外只能用公有类成员来访问 protected 成员. 只有在派生的时候, private 和 protected 关键字才能体现出差异来, 派生类的成员可以直接访问基类的保护成员, 但不能直接访问基类的私有成员. 因此对于类外部来说, protected 和 private 类似, 而对于派生类来说, protected 与 public 类似.
比如类 Human 类将 name 成员设置为 protected:
- class Human {
- protected:
- string name;
- ...
- };
在这种情况下它的派生类 Hero 可以直接访问 name, 而不需要使用 Human 中的方法:
- class Hero: public Human {
- void show() {
- cout << name << endl;
- }
- };
使用 protected 关键字在一些情况下可以简化代码的编写工作, 但也会存在一些设计缺陷. 比如有的时候, 有些变量值我们也不希望派生类能够直接修改.
- void Hero::modify(const string& n) {
- name = n;
- }
比如原本 name 名字是初始化之后不允许修改的, 但由于它被定义成了 protected, 所以在派生类当中可以随意修改, 这显然违背了我们的设计初衷.
针对这种情况, 比较好的做法是将所有的数据成员都设置成 private. 但是可以将一些特殊的方法设置成 protected, 这样既可以允许派生类调用这些 protected 的方法得到便利, 又不会过度开放权限导致敏感数据被篡改.
来源: http://developer.51cto.com/art/202201/697858.htm