当前位置: 首页 > news >正文

C++ 继承:面向对象的代码复用核心机制

C++ 继承:面向对象的代码复用核心机制

继承是面向对象三大特性(封装、继承、多态)中最能体现“代码复用”思想的机制。它允许我们从已有类(基类/父类)派生出新类(派生类/子类),从而直接获得基类的成员(数据 + 函数),并可按需扩展或修改行为。

1. 继承的基本语法与三种继承方式

// 基本写法class派生类名:[继承方式]基类名{// 新增成员};

C++ 支持三种继承方式,访问控制规则差异很大:

继承方式基类中 public 成员基类中 protected 成员基类中 private 成员最常用场景
publicpublicprotected不可访问最常用(接口继承、is-a 关系)
protectedprotectedprotected不可访问很少用(家族内部共享)
privateprivateprivate不可访问极少用(实现继承、has-a 伪装)

最推荐的记忆口诀(现代 C++ 几乎只用这一种):

99% 的情况下都写public继承
其他两种基本只在实现细节隐藏或框架设计时才会出现

2. 继承中最容易混淆的访问控制规则(面试高频)

classBase{public:intpub=1;protected:intprot=2;private:intpriv=3;public:voidshow(){std::cout<<pub<<prot<<priv<<"\n";}};classDerived:publicBase{public:voidtest(){pub=10;// OKprot=20;// OK// priv = 30; // 错误!private 成员不可见}};intmain(){Derived d;d.pub=100;// OK// d.prot = 200; // 错误!protected 对外不可见// d.priv = 300; // 错误}

一句话总结访问规则

  • 基类的private成员永远只对基类自己可见(派生类也看不到)
  • 基类的protected成员对派生类可见,但对外隐藏
  • 继承方式决定“基类 public/protected 成员在派生类中的最低访问级别”

3. 继承中的构造函数与析构函数调用顺序(最容易出错)

规则(必须背下来):

  1. 构造顺序:先构造基类 → 再构造派生类
  2. 析构顺序:先析构派生类 → 再析构基类(与构造顺序相反)
classBase{public:Base(){std::cout<<"Base 构造\n";}~Base(){std::cout<<"Base 析构\n";}};classDerived:publicBase{public:Derived(){std::cout<<"Derived 构造\n";}~Derived(){std::cout<<"Derived 析构\n";}};intmain(){Derived d;// 输出顺序:// Base 构造// Derived 构造// Derived 析构// Base 析构}

最重要结论

基类的析构函数必须是虚函数(几乎是铁律)

classBase{public:virtual~Base()=default;// 强烈推荐写虚析构};

如果基类析构不是虚函数,通过基类指针 delete 派生类对象时,只会调用基类析构函数 → 派生类部分资源泄漏。

4. 继承方式对比表(面试常考)

问题public 继承protected 继承private 继承
“is-a” 关系是否成立
能否通过基类指针/引用指向派生类对象否(编译错误)否(编译错误)
派生类能否向上转型
主要使用场景接口继承、实现继承内部实现细节共享实现细节完全隐藏(罕见)
2025–2026 实际使用比例≈95%≈4%<1%

5. 现代 C++ 中的继承使用建议(强烈推荐)

原则推荐做法理由 / 现代趋势
优先组合而非继承has-a > is-a组合更灵活,耦合更低
public 继承表示 is-a 关系只在真正满足里氏替换原则时使用避免违反 LSP(里氏替换原则)
基类析构函数一律写成 virtualvirtual ~Base() = default;防止通过基类指针 delete 导致内存泄漏
能用接口(纯虚类)就别用带数据成员的基类abstract base class(只有纯虚函数)接口隔离原则,更容易测试与替换
能用模板/CRTP 就尽量少用虚函数静态多态替代动态多态编译期决议,性能更高、可内联
禁用拷贝构造/赋值(如果不需要)=deleteRule of Zero / Rule of Five

6. 经典面试/笔试题型(建议都手写一遍)

  1. 写出下面代码的输出顺序(构造/析构顺序)
  2. 解释为什么基类析构函数要写成虚函数,并举例说明不写会发生什么
  3. 给出三种继承方式下,基类成员在派生类中的访问权限对比表
  4. 实现一个简单的 RAII 类(带虚析构)
  5. 解释“菱形继承”问题及 virtual 继承的解决方案(了解即可)

7. 现代 C++ 继承小结口诀

能组合不用继承
能接口不用数据成员
能虚函数用 CRTP 代替
基类析构永远写 virtual
public 继承写到手酸,其余两种基本不碰

你目前在学习/使用继承时最困惑的是哪一部分?

  • 虚继承与菱形问题?
  • 构造函数初始化列表的写法?
  • 多重继承的成员名冲突?
  • 纯虚函数与抽象类设计?
  • 继承与模板的结合(CRTP)?

可以直接告诉我,我会针对性给出更详细的代码示例与解释。

http://www.jsqmd.com/news/440414/

相关文章:

  • 关系到系统上线后的可用性与稳定性。而性能测试报告,作为承载测试结论、问题分析与优化建议的核心输出,决定了性能评估的专业性与决策价值。 ...
  • JDK源码之Object
  • 2026年黑龙江管材推荐厂家:MPP电力保护管、通信管、电力管、给水管、排水管、排污管、塑料管、硅芯管等各类塑料管材 - 海棠依旧大
  • 2026年广东广州沉香手串厂家优选指南 十大品质品牌参考 - 十大品牌榜
  • 飞算科技,让代码飞:欢迎体验 JavaAI 开发助手,参加炫技赛
  • 2026年3月全国脑抗衰培训机构广东深圳实力排行榜:基于专业体系与市场口碑的五大权威推荐榜单 - 十大品牌榜
  • 2026 中专大数据技术专业考证书门槛低的有哪些
  • 2026年全国脑抗衰培训品牌广东深圳优选指南 五大品质品牌参考 - 十大品牌榜
  • 程序员究竟要不要写文章
  • 2026年广东广州沉香品牌优选指南 十大品质厂家参考 - 十大品牌榜
  • 【x】DRAM、SRAM、DDR、FLASH、双通道的概念科普
  • 高端装备制造B端获客指南:2026年懂工业品营销的AI推广公司精选 - 品牌2026
  • 论文阅读:DIEN, CTR 模型
  • 手把手教你用9款AI论文工具,1小时搞定全文告别熬夜赶稿 - 麟书学长
  • 2026年黑龙江塑料管道标杆厂家最新推荐:PE管、PERT管、HDPE双壁波纹管、双壁波纹管、PPR管、PPR冷水管、PPR热水管、MPP电力保护管、黑龙江大唐管业多场景管材品质之选 - 海棠依旧大
  • 2026全国五大珠宝培训机构实力排行榜:聚焦技能提升,基于专业教学与市场口碑的权威推荐榜单 - 十大品牌榜
  • 论文阅读: MGDSPR, 淘宝向量召回方案
  • 2026年吸塑厂家实力推荐榜单:厚片吸塑/ABS吸塑/PC吸塑/工程机械与医疗吸塑外壳专业制造商,匠心工艺与创新应用深度解析 - 品牌企业推荐师(官方)
  • Chaney不会代码
  • 合规的金融理财服务AI推广方案,推荐几家专业的AI推广公司 - 品牌2026
  • 2026年全国打金培训机构优选指南 五大品质品牌参考 - 十大品牌榜
  • 当物理定律与高精度计算相遇:我的新开源项目 N-Body
  • 如何监控多个进程的存活和CPU、内存占用
  • Flutter 三方库 week_number 的鸿蒙化适配指南 - 掌控 ISO 标准周数计算、财务日历实战、鸿蒙级精密时序专家
  • 机械制造想通过AI推广拓展客户,推荐几家靠谱的AI推广公司 - 品牌2026
  • GitHub开源项目:IT-Tools源码构建部署及其部署排错
  • new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
  • 移植freertos的步骤
  • 2026年油雾净化设备厂家推荐排行榜:油雾收集器、过滤器、处理器、分离器、回收器,高效净化与节能环保的工业优选方案 - 品牌企业推荐师(官方)
  • 2026年哈尔滨塑料管材企业服务优质榜:PE穿线管、PPR管、波纹管、钢带波纹管、克拉管、HDPE双壁波纹管、雨水管 - 海棠依旧大