1、继承访问控制规则
C++ 中,继承访问控制规则决定了基类成员在派生类中的可见性:公有继承会保留基类 public
和 protected
成员的访问级别(public 仍为 public
,protected
保持为 protected
);保护继承会将基类的 public
和 protected
成员都转为 protected
;私有继承则将基类的 public
和 protected
成员都转为 private
,而无论哪种继承方式,基类的 private
成员在派生类中始终不可访问。
class Base { public: int pub; protected: int prot; private: int priv; };
定义以下三种继承方式的派生类:
class PublicDerived : public Base { // pub 变为 public // prot 变为 protected // priv 不可访问 }; class ProtectedDerived : protected Base { // pub 和 prot 都变为 protected // priv 不可访问 }; class PrivateDerived : private Base { // pub 和 prot 都变为 private // priv 不可访问 };
注意:不管使用哪种继承方式,私有成员 priv
永远不会被派生类访问。
2、继承方式对“IS-A”关系的影响
C++ 中,继承方式直接影响派生类与基类之间的“IS-A”关系:公有继承(public)保留了“IS-A”关系,派生类可以被当作基类使用;受保护继承(protected)和私有继承(private)则隐藏了继承关系,派生类不再是基类的“一个”,因此不能替代基类参与多态或隐式转换。
继承方式 | 外部是否知道继承关系 | 是否满足 IS-A 关系 | 派生类是否可向基类隐式转换 |
---|---|---|---|
public | ✅ 是 | ✅ 是 | ✅ 允许 |
protected | ❌ 否(仅子类可见) | ❌ 否 | ❌ 不允许 |
private | ❌ 否(仅本类可见) | ❌ 否 | ❌ 不允许 |
3、实际访问权限总结表
成员类型 | public继承 | protected继承 | private继承 |
---|---|---|---|
public 成员 | public | protected | private |
protected 成员 | protected | protected | private |
private 成员 | 不可访问 | 不可访问 | 不可访问 |
class Base { public: int x; protected: int y; private: int z; }; class A : public Base { // x 是 public, y 是 protected, z 不可访问 }; class B : protected Base { // x 和 y 都是 protected, z 不可访问 }; class C : private Base { // x 和 y 都是 private, z 不可访问 };
4、使用场景
public
继承 —— IS-A 关系
表示派生类是基类的一种。
示例:
class Dog : public Animal {}
private
继承 —— 实现复用
派生类内部使用基类功能,但不想让外部知道有继承关系。
示例:
class Logger : private FileWriter {}
protected
继承 —— 极少使用
派生类的子类可以访问基类成员,但外部不可访问。
一般用于模板类或类库内部优化。