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

C++补充基础小知识:什么是接口类 和 抽象类?为什么要继承?

接口类抽象类,确实有很多人容易混淆,今天我就一次性帮你彻底搞懂这两个概念,以及为什么要继承


🌳 1️⃣ 什么是接口类?什么是抽象类?

分类接口类 (Interface)抽象类 (Abstract Class)
定义只包含纯虚函数(没有实现)至少包含一个纯虚函数,可以有部分实现
目的只定义规范,不实现逻辑定义规范 + 可以提供部分实现
成员变量没有(通常不应该有)可以有成员变量和普通成员函数
典型例子class IShape { virtual void draw() = 0; };class Shape { virtual void draw() = 0; void move() {}; };
是否必须继承✅ 必须继承并实现✅ 必须继承并实现纯虚函数
特点类似于纯接口类似于半成品,可以扩展

举例 1:接口类

// 接口类:完全定义规范,不写实现
class IShape {
public:virtual void draw() = 0; // 纯虚函数virtual ~IShape() {}     // 虚析构
};

必须继承它才能用:

class Circle : public IShape {
public:void draw() override { qDebug() << "Draw Circle"; }
};

举例 2:抽象类

class Shape {
public:virtual void draw() = 0; // 抽象函数void move() { qDebug() << "Move shape"; } // 已实现
};

抽象类可以提供一部分公共实现(如 move()),子类继承后可以直接用。


🏗️ 2️⃣ 为什么必须继承它们?

因为:

  • 接口类抽象类只是“模板”/“规范”,没有完整实现,不能直接创建对象

  • 编译器禁止实例化(new)它们。

举例:

IShape shape; // ❌ 错误,不能创建接口类对象
Shape shape;  // ❌ 错误,不能创建抽象类对象

你必须 继承 + 实现纯虚函数,才能使用:

class Circle : public IShape {void draw() override { qDebug() << "Draw Circle"; }
};Circle c; // ✅ OK

🧭 3️⃣ 接口类 vs. 抽象类 - 什么时候用?

你要做什么?选哪个?举例
定义一个“规范”,子类必须遵循,且不需要公共代码接口类IDrawable, ISerializable
定义一个“规范”,但有些通用代码可以共享抽象类QWidget, QThread(部分实现)
已有完整实现,不需要额外规范具体类QTimer, QList

🏆 4️⃣ 总结

接口类 = 纯虚函数集合,只定义规范,不提供实现。
抽象类 = 至少有一个纯虚函数,可以提供部分实现
✅ 使用它们时,必须 继承并实现所有纯虚函数 才能创建对象。
✅ 目的是:面向接口编程,让代码更灵活、可扩展。


🎓 5️⃣ 举个生活中的例子

角色接口类抽象类具体类
概念会飞的东西(不能直接用)飞行工具(有一些基本结构,但不能直接买)一架飞机(可以买来用)
类比IFlyableAircraftBoeing737
特点只定义规范有些实现全部实现
代码virtual void fly() = 0;virtual void fly() = 0; void refuel() {}void fly() override {}

如果你有实际代码场景(比如某个类不知道该不该继承),发给我,我们一起看看! 🚀

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

相关文章:

  • 线程的生命周期?怎么终止线程?线程和线程池有什么区别?如何创建线程池?说一下 ThreadPoolExecutor 的参数含义?
  • yolov12毕设前置知识准备 1
  • Linux基本指令/上
  • Python常用模块实用指南
  • Python人工智能算法学习 禁忌搜索算法求解旅行商问题(TSP)的研究与实现
  • .net Winfrom 如何将窗口设置为MDI容器
  • QGIS新手教程2:线图层与多边形图层基础操作指南(点线互转、中心点提取与WKT导出)
  • Git:现代软件开发的基石——原理、实践与行业智慧·优雅草卓伊凡
  • go实例化结构体的方式
  • 【C/C++】设计模式之工厂模式:从简单到抽象的演进
  • 《接口和抽象类到底怎么选?设计原则与经典误区解析》
  • com.alibaba.fastjson.JSONException: default constructor not found.
  • 【25-cv-05887、25-cv-05893、25-cv-05897】一张图片连发3案!
  • 【Python实例】读取/处理 Landsat LST数据
  • Three.js引擎基础
  • HIS系统——药库管理模块功能解析
  • 【操作系统】内存管理知识点深度解析
  • 直播框架:基础知识点
  • 【基础题库回复四则】2022-1-26
  • git提交更改
  • 三强联合!Attention+LSTM,结合特征融合,起手二区!
  • 从“被动养老”到“主动健康管理”:平台如何重构代际关系?
  • Linux上给SD卡创建分区
  • 光谱相机在生态修复监测中的应用
  • LeetCode 463. 岛屿的周长 java题解
  • 软件测试之黑盒测试与白盒测试详解
  • python 小工具,获取 github 仓库信息
  • ORDER BY子句在一个 SQL 查询中只能出现一次
  • 全球轨道铺设设备市场发展现状与未来趋势分析
  • HDFS:解锁大数据存储的奥秘