一文搞清楚C++公有继承、私有继承、保护继承。

在面向对象编程(如C++)中,公有继承(public)、私有继承(private)和保护继承(protected)是三种不同的类继承方式,​​核心区别在于基类成员在派生类中的访问权限及可见性。以下是具体分析:


📊 ​​1. 公有继承(public inheritance)​

  • ​基类成员在派生类中的权限​​:

    • public成员 → 在派生类中仍为public

    • protected成员 → 在派生类中仍为protected

    • private成员 → ​​不可直接访问​​(仅在基类内部可见)。

  • ​派生类对象的访问能力​​:

    • 可通过派生类对象直接访问基类的public成员。

    • 无法通过对象访问基类的protectedprivate成员。

  • ​典型用途​​:实现 ​​“是一个(is-a)”关系​​(如“矩形是一种图形”),保留基类接口供外部使用。


🔒 ​​2. 私有继承(private inheritance)​

  • ​基类成员在派生类中的权限​​:

    • publicprotected成员 → 在派生类中均变为private

    • private成员 → ​​不可直接访问​​。

  • ​派生类对象的访问能力​​:

    • ​无法通过派生类对象直接访问任何基类成员​​(包括原public成员)。

  • ​关键限制​​:

    基类成员在派生类中成为私有,​​无法被进一步派生的子类访问​​(继承链终止)。

  • ​典型用途​​:实现 ​​“有一个(has-a)”关系​​(组合的替代方案),隐藏基类接口,仅重用实现逻辑。


🛡️ ​​3. 保护继承(protected inheritance)​

  • ​基类成员在派生类中的权限​​:

    • publicprotected成员 → 在派生类中均变为protected

    • private成员 → ​​不可直接访问​​。

  • ​派生类对象的访问能力​​:

    • ​无法通过派生类对象直接访问任何基类成员​​。

  • ​与私有继承的区别​​:

    基类的publicprotected成员在派生类中变为protected后,​​可被进一步派生的子类访问​​(继承链延续)。

  • ​典型用途​​:设计中间基类,允许派生类扩展功能但不暴露接口给外部。


⚖️ ​​三种继承方式的对比总结​

​继承方式​

​基类public成员 → 派生类​

​基类protected成员 → 派生类​

​派生类对象访问基类成员​

​是否支持多代继承​

​公有继承​

public

protected

可访问public成员

​私有继承​

private

private

❌不可访问

​保护继承​

protected

protected

❌不可访问

💎 ​​关键差异​​:

  • ​公有继承​​保留基类接口的公开性;

  • ​私有/保护继承​​隐藏基类接口,但​​保护继承允许派生类的子类继续访问基类成员​​,而私有继承则完全封禁。


🧩 ​​示例说明​

class Base {
public:    int pub;
protected: int prot;
private:   int priv;
};

// 公有继承
class DerivedPublic : public Base {
  // pub 为public, prot为protected, priv不可访问
};
DerivedPublic obj;
obj.pub = 1;  // ✅ 允许

// 私有继承
class DerivedPrivate : private Base {
  // pub和prot均变为private, priv不可访问
};
DerivedPrivate obj2;
obj2.pub = 1;  // ❌ 错误!外部不可访问

// 保护继承
class DerivedProtected : protected Base {
  // pub和prot均变为protected, priv不可访问
};
class SubDerived : public DerivedProtected {
  void func() { prot = 1; }  // ✅ 子类可访问基类的prot成员
};

💎 ​​总结​

  • ​公有继承​​:用于扩展基类功能并保留接口(面向用户)。

  • ​私有继承​​:用于完全隐藏基类实现(仅内部重用)。

  • ​保护继承​​:用于在继承链中共享基类实现但不暴露给外部(面向开发者)。

    实际选择需根据​​是否需要保留基类接口​​及​​是否需支持进一步派生​​来决定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值