在面向对象编程(如C++)中,公有继承(public
)、私有继承(private
)和保护继承(protected
)是三种不同的类继承方式,核心区别在于基类成员在派生类中的访问权限及可见性。以下是具体分析:
📊 1. 公有继承(public inheritance)
-
基类成员在派生类中的权限:
-
public
成员 → 在派生类中仍为public
。 -
protected
成员 → 在派生类中仍为protected
。 -
private
成员 → 不可直接访问(仅在基类内部可见)。
-
-
派生类对象的访问能力:
-
可通过派生类对象直接访问基类的
public
成员。 -
无法通过对象访问基类的
protected
或private
成员。
-
-
典型用途:实现 “是一个(is-a)”关系(如“矩形是一种图形”),保留基类接口供外部使用。
🔒 2. 私有继承(private inheritance)
-
基类成员在派生类中的权限:
-
public
和protected
成员 → 在派生类中均变为private
。 -
private
成员 → 不可直接访问。
-
-
派生类对象的访问能力:
-
无法通过派生类对象直接访问任何基类成员(包括原
public
成员)。
-
-
关键限制:
基类成员在派生类中成为私有,无法被进一步派生的子类访问(继承链终止)。
-
典型用途:实现 “有一个(has-a)”关系(组合的替代方案),隐藏基类接口,仅重用实现逻辑。
🛡️ 3. 保护继承(protected inheritance)
-
基类成员在派生类中的权限:
-
public
和protected
成员 → 在派生类中均变为protected
。 -
private
成员 → 不可直接访问。
-
-
派生类对象的访问能力:
-
无法通过派生类对象直接访问任何基类成员。
-
-
与私有继承的区别:
基类的
public
和protected
成员在派生类中变为protected
后,可被进一步派生的子类访问(继承链延续)。 -
典型用途:设计中间基类,允许派生类扩展功能但不暴露接口给外部。
⚖️ 三种继承方式的对比总结
继承方式 |
基类public成员 → 派生类 |
基类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成员
};
💎 总结
-
公有继承:用于扩展基类功能并保留接口(面向用户)。
-
私有继承:用于完全隐藏基类实现(仅内部重用)。
-
保护继承:用于在继承链中共享基类实现但不暴露给外部(面向开发者)。
实际选择需根据是否需要保留基类接口及是否需支持进一步派生来决定。