C++ 中,类可以通过三种方式继承基类:public(公有继承)、protected(受保护继承)和 private(私有继承)。它们控制了基类成员在派生类中的可访问性,以及派生类对外暴露基类接口的方式。

1、继承访问控制规则

 C++ 中,继承访问控制规则决定了基类成员在派生类中的可见性:公有继承会保留基类 public protected 成员的访问级别(public 仍为 publicprotected 保持为 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成员publicprotectedprivate
protected成员protectedprotectedprivate
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 继承 —— 极少使用

  • 派生类的子类可以访问基类成员,但外部不可访问。

  • 一般用于模板类或类库内部优化。

推荐文档