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

C++补充基础小知识:为什么要继承、什么时候继承、什么时候直接用

下面我会从 为什么要继承什么时候继承什么时候直接用 三个方面,结合实际场景详细讲解,帮你彻底搞懂!


🧱 1️⃣ 为什么要继承?

继承(class A : public B)的目的是:

👉 为了复用和扩展功能

  • 复用已有类的代码,减少重复劳动

  • 扩展已有类的功能,在不修改原类的情况下,新增或修改功能

📌 举个简单的例子:

class Animal {
public:void eat() { qDebug() << "Animal eats."; }
};class Dog : public Animal {
public:void bark() { qDebug() << "Dog barks."; }
};

这里 Dog 继承了 Animal,就能直接用 eat(),不用自己再写一个。


🧭 2️⃣ 什么时候需要继承?

适合继承的场景:

场景为什么需要继承?
有共性功能,需要在子类中复用避免重复代码,代码维护更方便
需要多态(虚函数)让不同的子类表现不同,增强扩展性
框架要求(如 Qt 的事件处理、接口实现)比如继承 QWidgetQThread,才能处理信号槽、事件
想扩展一个类的功能,但不能修改原类比如第三方库的类,你不能改源代码,只能继承

✅ 经典例子(必须继承的场景):

  • Qt 自定义窗口:

    class MyWidget : public QWidget
    

    因为你要自定义 paintEvent()mousePressEvent(),所以必须继承 QWidget

  • 多态接口:

    class Shape { virtual void draw() = 0; };  // 接口类
    class Circle : public Shape { void draw() override; };
    
  • 扩展功能:

    class MyButton : public QPushButton { ... };
    

    因为你想加上特殊的绘制或信号,所以继承 QPushButton


🪄 3️⃣ 什么时候可以直接使用,不需要继承?

当你只需要 调用类提供的功能,而不需要修改或扩展 时,直接创建就好,无需继承。
✅ 典型例子:

QTimer *timer = new QTimer(this);
timer->start(1000);

✅ 不需要继承 QTimer,因为你只用它的计时功能。

再比如:

QByteArray data;
QList<int> numbers;

这些都是工具类、数据结构,直接用就好。


🎯 4️⃣ 总结一句话(判断标准):

是否继承?判断标准
✅ 需要继承想要复用代码 + 扩展功能 + 支持多态
❌ 不需要继承只是调用功能,不需要改或加新功能

🔍 5️⃣ 一个具体例子:

不继承的用法(够用了,不需要改):

QPushButton *btn = new QPushButton("Click me");
btn->show();

需要继承的用法(要加新功能):

class MyButton : public QPushButton {
protected:void mousePressEvent(QMouseEvent *event) override {qDebug() << "MyButton pressed!";QPushButton::mousePressEvent(event);  // 调用父类原功能}
};

🌳 结论(思维导图版):

是否继承?
├── 只用功能? → 不需要继承(如QTimer、QList)
└── 想扩展功能?├── 重写函数? → 需要继承(如QWidget)├── 多态接口? → 需要继承(如虚函数类)├── 框架要求? → 需要继承(如Qt事件系统)└── 不需要 → 直接创建对象用就行

如果你有具体的代码场景(比如某个类不确定要不要继承),可以发我看看,我帮你具体分析! 🚀

http://www.xdnf.cn/news/702793.html

相关文章:

  • 高并发计数器LongAdder 实现原理与使用场景详解
  • Jmeter性能测试(应用场景、性能测试流程、搭建测试环境)
  • 实例与选项对象
  • SpringBoot+Vue+Echarts实现可视化图表的渲染
  • 自动生成程序的heap文件
  • #!/usr/bin/env python
  • JS中的属性描述符
  • Day 20
  • 生成式引擎在不同行业的应用案例
  • 第十章 Java基础-Static静态变量
  • 基于物理约束的稀疏IMU运动捕捉系统
  • spring和Mybatis的各种查询
  • Rust 学习笔记:使用迭代器改进 minigrep
  • 力扣刷题Day 61:子集(78)
  • 【案例94】笛卡尔积导致报“临时表空间不足”
  • bat 批处理通过拖拽,来获取拖入文件的信息
  • 【25-cv-00656】Whitewood律所代理Olga Drozdova 蝴蝶版权图维权案
  • 【Web应用】若依框架:基础篇07功能详解-定时任务
  • 不同坐标系下的 面积微元
  • Android-Room + WorkManager学习总结
  • 2G Nand Jlink烧录报错Failed to allocated 0x1B000000 bytes of memory!
  • 5G 核心网中 NRF 网元的功能、接口及参数详解
  • 8.7 使用 EAP-AKA 进行订阅转移
  • 星图云交通综合应用解决方案:破解交通基建抢建拖建、工程量大等难题,赋能智慧交通
  • 2025年5月AI科技领域周报(5.19-5.25):大模型多模态突破 具身智能开启机器人新纪元
  • DockThor: 免费的在线小分子“虚拟筛选”平台
  • 即插即用!全新记忆回溯策略:一种元启发式算法的进化更新机制,含完整免费MATLAB代码
  • 数字化时代,健康管理系统如何改变健康管理?
  • 数据库与缓存数据不一致的解决方法
  • 动态规划题解——爬楼梯(力扣70 easy)