17370845950

c++中public, protected, private继承的区别_c++继承访问控制详解
public继承保持基类成员访问权限,protected继承将public和protected成员变为protected,private继承均使其变为private,基类private成员均不可直接访问。

在C++中,继承的访问控制不仅影响基类成员在派生类中的可见性,还决定了外部代码能否访问这些成员。public、protected 和 private 继承是三种不同的继承方式,它们对基类成员的访问权限产生不同的影响。

1. public 继承

使用 public 关键字进行继承时,基类的成员访问权限在派生类中保持不变:

  • 基类的 public 成员在派生类中仍是 public
  • 基类的 protected 成员在派生类中仍是 protected
  • 基类的 private 成员不可直接访问(但可通过基类的 public/protected 接口间接访问)

这是最常用的继承方式,体现了“is-a”关系。派生类对象可以被当作基类对象使用。

示例:

class Base {
public:
    void pub() {}
protected:
    void prot() {}
private:
    void priv() {}
};

class Derived : public Base { // pub() 是 public // prot() 是 protected // priv() 不可访问 };

2. protected 继承

使用 protected 继承时,基类的所有 publicprotected 成员在派生类中都变为 protected

  • 基类的 public 成员 → 派生类中为 protected
  • 基类的 protected 成员 → 派生类中仍为 protected
  • 基类的 private 成员 → 不可访问

这种继承方式限制了外部对基类 public 成员的直接访问,适用于不希望派生类对外暴露基类接口的场景。

示例:

class Derived : protected Base {
    // pub() 变为 protected
    // prot() 仍为 protected
};
// outside code cannot call d.pub()

3. private 继承

使用 private 继承时,基类的所有 publicprotected 成员在派生类中都变为 private

  • 基类的 public 成员 → 派生类中为 private
  • 基类的 protected 成员 → 派生类中为 private
  • 基类的 private 成员 → 不可访问

private 继承表示“按照…实现”,而不是“是一个”。它常用于实现代码复用,但不希望暴露基类接口。此时,派生类对象不能隐式转换为基类指针或引用。

示例:

class Derived : private Base {
    // pub() 和 prot() 都变为 private
};
// Derived d; Base* p = &d; // 错误:不能隐式转换

4. 访问控制总结表

继承方式 基类 public 成员 基类 protected 成员 基类 private 成员
public public protected 不可访问
protected protected protected 不可访问
private private private 不可访问

无论哪种继承方式,基类的 private 成员始终不能在派生类中直接访问。

5. 实际使用建议

  • 优先使用 public 继承,用于表达“is-a”关系
  • private 继承可用于替代组合(has-a),当需要访问基类 protected 成员时
  • protected 继承较少使用,适合中间层封装
  • 若不需要继承接口,考虑使用组合而非 private 继承

基本上就这些。理解这三种继承方式的关键在于掌握基类成员在派生类中的访问级别变化规则,并根据设计意图选择合适的继承方式。