C++ 关键字 protected
Protected 介绍
C++ 中使用public、private、protected 这三个关键字来控制对类成员的访问。关键字 protected 下的成员在类外是无法被访问的,这一点与 private 类似,它们的区别主要在类的继承上。
派生类可以直接访问基类的 protected 成员,但不能访问基类的 private 成员。因此,可以这样简单理解:对于类外面来说, protected 与 private 相似,但对于派生类来说,protected 与public 相似。
示例代码
下面看代码片段示例:
#include <iostream>
// 基类
class Base {
public:
// 设计者希望使用 set 和 get 来访问 m_ptd;
bool set_ptd(int value) { m_ptd = value; }
bool get_ptd() { return m_ptd; }
private:
int m_pve;
protected:
int m_ptd;
};
// 派生类
class Driver : public Base {
void func() {
m_ptd = 1; // 可以,但是违背了设计者用 set 和 get 访问 m_ptd 的初衷
m_pve = 1; // 不可以,派生类不能访问基类的私有成员
}
};
int main(int argc, char const *argv[]) {
Base base;
base.m_ptd; // 不可以,类外部不能访问私有或者保护成员
base.m_pve; // 不可以,类外部不能访问私有或者保护成员
Driver driver;
driver.m_pve; // 不可以,类外部不能访问私有或者保护成员
driver.m_ptd; // 不可以,类外部不能访问私有或者保护成员
return 0;
}
注意事项
- protected 虽然可以简化代码设计,但也存在缺陷:上面代码中,设计者希望只能通过 set 和 get 方法修改 m_ptd, 但是派生类可能破坏这种保护措施。
- 最好对数据成员采用 private 方式,不要使用 protected,同时通过基类方法使派生类能够访问基类数据。
- 对于成员函数而言, protected 很有用,它能够让派生类访问公众不能使用的内部函数。