C++ 继承不只是“抄代码”!三种继承方式,权限大不同!
你以为
class Son : public Base中的public只是个摆设?
错!它决定了子类能“看到”父类多少内容,甚至影响整个类的设计!
大家好!在上一篇我们讲了继承如何减少重复代码,今天我们要深入一步:
C++ 的继承,其实有三种“姿势”——公共继承、保护继承、私有继承。
它们看起来只差一个关键字,但对成员访问权限的影响却天差地别!
别担心,我们用一个清晰的例子 + 表格对比,带你彻底搞懂!
📌 先看基础:父类的三种成员权限
假设我们有一个基类Base:
class Base { public: int m_A; // 公共成员 protected: int m_B; // 保护成员 private: int m_C; // 私有成员(子类永远不可见) };public:任何地方都能访问protected:类内部 + 派生类可访问,外部不可private:仅本类内部可访问,子类也看不到!
⚠️ 注意:无论哪种继承方式,父类的 private 成员,子类都不可直接访问!
🔑 三种继承方式,到底有什么区别?
C++ 的继承语法是:
class 子类 : 继承方式 父类其中继承方式有三种:
继承方式 | 语法示例 | 对父类成员权限的影响 |
|---|---|---|
公共继承 | : public Base | 权限保持不变 |
保护继承 | : protected Base | 父类的 |
私有继承 | : private Base | 父类的 |
下面我们逐个来看!
✅ 1. 公共继承(public inheritance)
class Son1 : public Base { public: void func() { m_A; // ✅ 可访问(仍是 public) m_B; // ✅ 可访问(仍是 protected) // m_C; // ❌ 不可访问(private) } }; void test() { Son1 s; s.m_A; // ✅ 外部可以访问(因为是 public) }💡公共继承 = “是…的一种”关系
比如 “学生 是 人 的一种”,所以通常用public,这也是最常用的继承方式!
🔒 2. 保护继承(protected inheritance)
class Son2 : protected Base { public: void func() { m_A; // ✅ 可访问,但在 Son2 中已变成 protected m_B; // ✅ 可访问(仍是 protected) // m_C; // ❌ 不可访问 } }; void test() { Son2 s; // s.m_A; // ❌ 编译错误!m_A 在 Son2 中是 protected,外部不能访问 }💡保护继承 = “内部复用,但不对外暴露”
适用于:你想复用父类功能,但不希望用户通过子类对象直接访问父类接口。
🗝️ 3. 私有继承(private inheritance)
class Son3 : private Base { public: void func() { m_A; // ✅ 可访问,但在 Son3 中变为 private m_B; // ✅ 可访问,也变为 private // m_C; // ❌ 不可访问 } }; // 再派生一层 class GrandSon3 :public Son3 { public: void func() { // m_A; // ❌ 无法访问!因为 Son3 是私有继承,GrandSon3 看不到 Base 的成员 // m_B; // ❌ 同上 } }; void test() { Son3 s; // s.m_A; // ❌ 外部无法访问(已是 private) }💡私有继承 ≈ “组合”的替代写法
它表示“用到了父类的功能,但不是‘是一种’的关系”。
比如:Car私有继承Engine—— 车“包含”引擎,但车不是引擎!
📊 一张表总结所有情况
父类成员 | public 继承 | protected 继承 | private 继承 |
|---|---|---|---|
public成员 | → 子类中仍为 | → 变为 | → 变为 |
protected成员 | → 仍为 | → 仍为 | → 变为 |
private成员 | → 子类不可见 | → 子类不可见 | → 子类不可见 |
✅记住口诀:
“公继承保原样,保继承降一级,私继承全私藏!”
🎯 实际开发中怎么选?
90% 场景用
public继承:当你想表达 “A 是 B 的一种”(如 Dog 是 Animal)极少用
protected/private继承:多用于底层库设计或特殊封装需求如果只是想“复用代码”而非“建立类型关系”,优先考虑组合(has-a)而非私有继承
🔚 小结
C++ 的继承不只是“复制粘贴”,更是一种权限控制机制。
三种继承方式,本质是在回答一个问题:
“我愿意让别人通过子类看到父类的哪些部分?”
掌握它们,你才能写出既安全又灵活的面向对象代码!
📬思考题:
如果Base中有一个public函数void show(),
在private继承下,能否在子类的成员函数中调用它?
外部能否通过子类对象调用?欢迎留言讨论!
💡提示:你提供的示例非常经典,清晰展示了三种继承对成员可见性的影响。建议在学习时动手运行一遍,加深理解!
如果你觉得这篇推文有帮助,欢迎点赞、转发给正在啃 C++ 的小伙伴!下期我们聊聊“继承中的
构造与析构顺序”,敬请期待~ 😊