C++ 纯虚函数 — 抽象接口

前言:C++中纯虚函数是一个重要的特性、方法,若正确使用能够优化代码结构,提升层次性,增强可阅读性。在之前的文章中(C++ 虚函数 解析指南-CSDN博客),一笔带过了纯虚函数的介绍,本文将对纯虚函数做一些详细的解读,希望能够为童鞋们平时的项目开发提供新的思路和帮助。

目录

一、纯虚函数基本概念和语法

二、纯虚函数的作用

三、纯虚函数代码示例

3.1 抽象基类Shape

3.2 派生类Rectangle

3.3 派生类Circle

3.4 基类指针实现多态

四、纯虚析构函数

五、纯虚函数的高级应用

5.1 抽象接口设计

5.2 工厂模式

5.3 模板方法模式

六、纯虚函数可以有实现吗


一、纯虚函数基本概念和语法

C++中,纯虚函数是一种特殊的虚函数,它在基类中声明但没有提供实现。纯虚函数通过在声明后添加=0来标识:

virtual void functionName() = 0; // 声明纯虚函数

在类中声明虚函数:

class AbstractClass { public: // 声明一个纯虚函数 virtual void pureVirtualFunc() = 0; // ... 其他成员函数 private: // ... 数据成员 };

关于纯虚函数定义与使用 需要注意:

  • 纯虚函数一般只有函数声明,没有函数体
  • 在函数声明的末尾添加=0,其作用是形式上告诉编译器这是一个纯虚函数
  • 包含纯虚函数的类称为抽象类,抽象类无法进行实例化(即,无法定义对象)
  • 派生类必须重写(override)基类中的纯虚函数,并提供该函数的具体实现,否则该派生类仍然被视为抽象类

二、纯虚函数的作用

那么纯虚函数的好处在哪里,为什么C++要引入纯虚函数呢?

纯虚函数主要为了解决在面向对象程序设计中常见的一些问题,并提供一种强制性的接口约定。其主要好处包括:

  • 抽象接口:通过在基类中声明纯虚函数,可以为派生类定义一个统一的抽象接口规范。所有派生类都必须实现这个接口,从而确保它们都提供了基类中所声明的行为。
  • 强制实现:纯虚函数的存在强制派生类必须提供该函数的实现,否则派生类也将成为抽象类,无法实例化。这种机制确保了接口的一致性,避免了派生类遗漏重要功能的实现。
  • 多态性支持:纯虚函数本身是虚函数的一种,因此它支持运行时多态。通过基类指针或引用调用纯虚函数时,实际调用的是派生类中重写的实现,从而实现多态行为。
  • 避免实例化不合理的对象:某些基类本身并不需要实例化(例如“形状”基类),它们的存在只是为了提供一个抽象概念。通过将其设计为抽象类(包含纯虚函数),可以防止用户直接实例化不合理的对象,从而提高代码的结构层次与可读性。

三、纯虚函数代码示例

这里举一个例子说明,如何使用抽象类和纯虚函数来定义形状相关的一些接口,并由派生类提供具体实现。

3.1 抽象基类Shape

首先,定义一个抽象基类Shape,其中声明了纯虚函数getArea(),用于计算形状的面积。此外,为了完整性,还包含了一个非纯虚的析构函数,以确保正确释放资源。

class Shape { public: virtual ~Shape() {} // 虚析构函数,确保正确析构 // 纯虚函数:计算面积,仅接口 无实现 virtual double getArea() const = 0; };

3.2 派生类Rectangle

其次,定义一个派生类Rectangle,继承自Shape,并提供getArea()函数的具体实现。

class Rectangle : public Shape { public: Rectangle(double len, double wid) : length(len), width(wid) {} // 实现纯虚函数:计算矩形的面积 double getArea() const override { return length * width; } private: double length; double width; };

3.3 派生类Circle

同样,定义另一个派生类Circle,继承自Shape,并提供getArea()函数的具体实现。

class Circle : public Shape { public: Circle(double r) : radius(r) {} // 实现纯虚函数:计算圆形的面积 double getArea() const override { return 3.14159265 * radius * radius; } private: double radius; };

3.4 基类指针实现多态

在main()函数中,我们定义一个基类指针Shape*,并让该指针指向派生类Rectangle或Circle的对象。通过这个指针调用getArea()函数,可以实现多态行为

int main() { Shape* shape1 = new Rectangle(10.0, 5.0); // 指向 Rectangle 对象 Shape* shape2 = new Circle(7.0); // 指向 Circle 对象 // 调用纯虚函数 getArea() cout << "Area of rectangle: " << shape1->getArea() << endl; cout << "Area of circle: " << shape2->getArea() << endl; delete shape1; delete shape2; return 0; }

四、纯虚析构函数

析构函数(Destructor)用于在对象生命周期结束时执行清理工作。将析构函数声明为虚函数可以确保通过基类指针删除派生类对象时,调用正确的析构函数序列。

纯虚析构函数的作用:如果基类的析构函数被声明为纯虚函数,那么该基类成为抽象类,派生类必须实现析构函数,否则该派生类也将成为抽象类,无法实例化。这种机制强制派生类提供析构函数的实现,确保了析构函数的完整性。

五、纯虚函数的高级应用

纯虚函数在实际项目中的应用非常广泛,特别是在需要定义接口、强制实现一致性和实现多态行为的场景中。

5.1 抽象接口设计

接口设计:纯虚函数是定义接口的主要手段之一。通过在抽象类中声明一组纯虚函数,可以定义清晰的接口规范,供其他类实现。这种设计提高了代码的模块化和可维护性。

5.2 工厂模式

工厂模式:工厂模式经常与纯虚函数结合使用。工厂基类可以提供一个纯虚函数用于创建产品对象,具体的工厂类通过重写该函数来创建特定类型的产品。

5.3 模板方法模式

模板方法模式:模板方法模式在基类中定义算法的骨架,将某些步骤定义为纯虚函数,由派生类实现具体步骤。

六、纯虚函数可以有实现吗

上文提到纯虚函数一般来说只有声明,没有实现。其实,纯虚函数是可以有实现的,这是很多人忽略的一个点。

  • 纯虚函数可以在类外提供实现(但类内的声明仍然是= 0)。
  • 派生类可以“显式调用”这个实现。

举个简单示例:

class Base { public: virtual void foo() = 0; // 纯虚函数 }; void Base::foo() { // 类外提供实现 // ... 实现体 } class Derived : public Base { public: void foo() override { // 可以在这里调用 Base 的实现 Base::foo(); // 再加上派生类自己的行为 } };

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1184941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据领域数据血缘:应对数据复杂性的利器

数据血缘:大数据世界的“家族树”,帮你理清数据的来龙去脉 关键词 数据血缘、大数据复杂性、元数据管理、数据 lineage、数据治理、数据追溯、数据可靠性 摘要 在大数据时代,企业的数据就像一棵枝繁叶茂的大树:根须深入业务系统、日志、第三方等各类数据源,树干是ETL、…

全网最细,电商平台项目测试常遇bug+测试点(汇总)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、电商项目常遇b…

参考文献在哪里找:实用查找方法及资源推荐

做科研的第一道坎&#xff0c;往往不是做实验&#xff0c;也不是写论文&#xff0c;而是——找文献。 很多新手科研小白会陷入一个怪圈&#xff1a;在知网、Google Scholar 上不断换关键词&#xff0c;结果要么信息过载&#xff0c;要么完全抓不到重点。今天分享几个长期使用的…

书籍-凯撒《高卢战记》

凯撒《高卢战记》详细介绍 书籍基本信息 书名&#xff1a;高卢战记&#xff08;Commentarii de Bello Gallico&#xff0c;意为"关于高卢战争的评论"&#xff09; 作者&#xff1a;凯撒&#xff08;Gaius Julius Caesar&#xff0c;公元前100年-前44年&#xff09; 成…

2026 年 1 月电动雨棚厂家推荐排行榜:遥控/伸缩/推拉/定制/悬空/仓库/篮球场雨棚,创新智能与坚固耐用品质之选 - 企业推荐官【官方】

2026 年 1 月电动雨棚厂家推荐排行榜:遥控/伸缩/推拉/定制/悬空/仓库/篮球场雨棚,创新智能与坚固耐用品质之选 随着城市化进程的加速和工商业态多元化发展,户外空间的灵活利用与保护需求日益凸显。雨棚,尤其是集成…

【快速EI检索 | 广州大学主办丨EI稳定检索 | 征稿范围广 | 学生优惠、团队优惠、学生友好】2026年人工智能与数字服务国际学术会议(ICADS 2026)

2026年人工智能与数字服务国际学术会议&#xff08;ICADS 2026&#xff09; 2026 International Conference on Artificial Intelligence and Digital Services (ICADS 2026) 2026年2月6日&#xff08;周五&#xff09;&#xff5c;线上召开 大会官网&#xff1a;www.ic-icad…

基于非对称纳什谈判的多微网电能共享运行优化策略Matlab代码

✅作者简介&#xff1a;热爱数据处理、建模、算法设计的Matlab仿真开发者。&#x1f34e;更多Matlab代码及仿真咨询内容点击 &#x1f517;&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知。&#x1f525; 内容介绍推进可再生能源高效利用,实现电力系统…

架构之DID(Design-Implement-Deploy)方法论

架构之DID方法论&#xff1a;设计-实施-部署 概述 DID&#xff08;Design-Implement-Deploy&#xff09;是一种架构可扩展性方法论&#xff0c;旨在以最经济有效的方式保证系统的可扩展性。通过在系统生命周期的不同阶段采用不同的容量规划策略&#xff0c;实现资源利用的最优化…

Uniapp——苹果IOS离线打自定义基座教程

文章目录概要1.官方下载SDK插件基座源码&#xff1b;2.项目概要讲解&#xff1b;小结概要 提示&#xff1a;为了节省云打包费用使用离线打包 1.官方下载SDK插件基座源码&#xff1b; 提示&#xff1a;这里可以添加技术整体架构 https://nativesupport.dcloud.net.cn/AppDocs/d…

【快速EI检索 | 211高校武汉理工大学作为支持单位!主讲嘉宾已确定 | 本届会议已成功通过ACM出版!稳定EI检索】2026年人工智能与控制国际学术会议(CAIC 2026)

2026年人工智能与控制国际学术会议&#xff08;CAIC 2026&#xff09; 2026 International Conference on Artificial Intelligence and Control(CAIC 2026) 2026年2月6日-8日&#xff5c;中国-三亚 大会官网&#xff1a;https://www.iccaic.net/ 截稿时间&#xff1a;见官网…

软考老金的五篇论文指导如何改变我的备考轨迹

备考高项前&#xff0c;我最怕的就是论文。作为一个普通企业的行政人员&#xff0c;我哪有什么"大型IT项目管理经验"&#xff1f;但跟着金老师学完五篇论文作业后&#xff0c;我不仅不怕了&#xff0c;还在考场上写出了57分的论文&#xff01;一、五篇作业&#xff1…

二阶锥松弛在配电网最优潮流计算中的应用Matlab实现

✅作者简介&#xff1a;热爱数据处理、建模、算法设计的Matlab仿真开发者。&#x1f34e;更多Matlab代码及仿真咨询内容点击 &#x1f517;&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知。&#x1f525; 内容介绍最优潮流计算是电网规划,优化运行的重…

Kotlin 2025–2026 客户端开发路线:语言升级 × 跨端落地 × AI Agent 入门

Kotlin 2025–2026 客户端开发路线&#xff1a;语言升级 跨端落地 AI Agent 入门结论&#xff08;先把路标立住&#xff09;&#xff1a; 2025–2026 这条 Kotlin 技术线&#xff0c;客户端同学最值得投入的三件事是&#xff1a; 语言与工具链升级&#xff1a;围绕 Kotlin 2.…

Springboot七彩花都线上鲜花订购平台rzb8b4z2(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能 用户,商家,鲜花分类,鲜花信息,咨询商家,公告信息,轮播图,订单管理 开题报告核心内容 SpringBoot线上鲜花订购平台开题报告 一、研究背景与意义 &#xff08;一&#xff09;研究背景 随着互联网技术的飞速发展和电子商务的普及&#xff0c;人们…

告别服务器失联的神器Prometheu加上cpolar 让监控告警不再困于局域网

Prometheus、node_exporter、Alertmanager 这套组合是服务器监控的实用工具&#xff0c;Prometheus 可实时采集 CPU、内存等核心指标并自定义告警规则&#xff0c;node_exporter 轻量易部署&#xff0c;能快速收集服务器硬件数据&#xff0c;Alertmanager 则负责告警的分类、推…

第64集科立分板机:分板机常见类型及优缺点介绍

分板机是用于分割电路板的设备&#xff0c;主要将连接在一起的电路板分离成单个单元&#xff0c;广泛应用于电子产品制造业&#xff0c;已基本取代传统人工折板方式。以下为你详细介绍&#xff1a;常见类型及优缺点走刀式分板机&#xff1a;成本低&#xff0c;但只能进行直线分…

【性能测试】10_JMeter _JMeter连接数据库(重点)

文章目录一、场景1.1 思考&#xff1a;测试人员为什么连接数据库&#xff1f;1.2 启动tpshop数据库服务器二、连接数据库的步骤三、实现数据库连接3.1 添加数据库驱动-2种方法3.2 配置数据库连接池属性3.3 发送JDBC请求四、查看运行结果一、场景 1.1 思考&#xff1a;测试人员…

2026-01-19 闲话 大三上期末

2026-01-19 闲话 大三上期末这学期有三门必修课,两门选修课。目前考了如下四门。无论成绩怎么样、是否挂科了。我都去参加了考试,没有怯战。 泛函分析 这门课引入了无穷维向量这样一个概念。 定义了完备的赋范空间为…

[吾爱大神原创工具] Excel 数据批量转 Word 工具(2026年最新版)

[吾爱大神原创工具] Excel 数据批量转 Word 工具&#xff08;2026年最新版&#xff09; 链接&#xff1a;https://pan.xunlei.com/s/VOjL7SpjaP3oeyQKJ82ZoGOsA1?pwdqh2t# 将 Excel 数据按照 Word 模板规则进行批量转换效率高、配置灵活、完全离线可用。

提示词到代码一条龙:OpenCSG公益课拆解

由特许全球金融科技师CGFT认证项目&#xff08;Chartered Global FinTech) 、模速空间与OpenCSG&#xff08;开放传神&#xff09;联合推出《普通人的AI掘金课——6天学会&#xff0c;马上能用》系列直播课程&#xff0c;把很多人心里的疑问说透了&#xff1a;“我不太会编程&a…