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 的事件处理、接口实现) | 比如继承 QWidget 、QThread ,才能处理信号槽、事件 |
想扩展一个类的功能,但不能修改原类 | 比如第三方库的类,你不能改源代码,只能继承 |
✅ 经典例子(必须继承的场景):
-
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事件系统)└── 不需要 → 直接创建对象用就行
如果你有具体的代码场景(比如某个类不确定要不要继承),可以发我看看,我帮你具体分析! 🚀