protected成员专为继承设计,允许派生类成员函数直接访问基类受保护成员,禁止任何对象(基类或派生类)通过点号访问,体现封装与继承协作的核心机制。

受保护成员的核心作用是:让基类把部分内部状态或逻辑开放给子类复用,同时拒绝外部直接访问。它不是“半公开”,而是专为继承链设计的协作接口。
protected 成员在 C++ 中怎么写、怎么用
在基类中用 protected: 块声明成员,例如:
class Base {
protected:
int m_cache;
void helper() { /* ... */ }
};
派生类可直接使用,无需 getter/setter:
class Derived : public Base {
void calc() {
m_cache = 42; // ✅ 合法:在派生类成员函数体内
helper(); // ✅ 合法
}
};
但以下全部非法,编译直接报错:
- Derived d; d.m_cache = 0;(对象点号调用)
- Base b; b.m_cache;(哪怕在同一个文件)
- void global_func() { Base b; b.m_cache; }(全局函数里)
- friend void f(Base&); void f(Base& b) { b.m_cache; }(友元不继承权限)
Python 中的受保护成员是约定,不是强制
以单下划线开头(如 _value)表示受保护,语义上建议只在类内或子类中使用:
class Parent:
def __init__(self):
self._data = "internal"
class Child(Parent):
def update(self):
self._data = "modified" # ✅ 子类可读写
但它能被外部代码直接访问(不会报错),仅靠开发者自觉遵守:
- obj = Child(); print(obj._data) → 运行通过,但不推荐
- 没有编译期检查,也不阻止 IDE 警告或静态分析工具标记
别混淆:protected 成员 ≠ protected 继承
这是两个独立机制:
- protected 成员:控制「谁能在哪访问这个变量/函数」——只允许本类 + 派生类成员函数访问
- class D : protected B:控制「B 的 public 成员在 D 内部变成什么权限」——B::func() 在 D 中变为 protected,D 对象无法隐式转成 B*,破坏 is-a 关系
举例:若 B 有 public int x 和 protected int y,那么:
- D 公有继承:x 仍 public,y 仍 protected
- D protected 继承:x 变为 protected,y 仍是 protected
- D private 继承:x 和 y 都变为 private
什么时候该用受保护成员?
只在满足以下全部条件时才设为 protected:
- 这个数据或函数会被子类逻辑依赖(比如共享缓存、中间计算值)
- 你不希望它出现在类的公有接口里(用户不该也不需直接操作)
- 你接受未来所有子类都可能耦合到它——一旦修改,所有子类都要适配
反例:
- 把内部缓冲区状态设为 protected → 暴露实现细节,后续重构困难
- 把本该由子类定制的尺寸字段设为 private → 子类只能重复实现或加 friend,违背开闭原则

















