news 2026/4/23 9:45:19

《你真的了解C++吗》No.022:纯虚函数与抽象类的真正用途——契约式编程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《你真的了解C++吗》No.022:纯虚函数与抽象类的真正用途——契约式编程

《你真的了解C++吗》No.022:纯虚函数与抽象类的真正用途——契约式编程

导言:强制性的“蓝图”

在多态体系中,有时基类代表的是一个极其抽象的概念(比如“形状”或“文件对象”)。在这一层级,我们无法给出一个有意义的默认实现。

纯虚函数(Pure Virtual Function)允许我们只声明接口的“长相”,而将实现的责任完全推给派生类。这种机制将 C++ 类从单纯的“代码容器”提升到了“架构契约”的高度。


一、 语法本质:那一个= 0意味着什么?

当你写下virtual void draw() = 0;时,你并不是在给函数赋值为零,而是向编译器发出了三条指令:

  1. 禁止实例化:这个类现在成为了抽象类(Abstract Class)。你永远不能写出Shape s;这样的代码,编译器会报错。
  2. 虚表占位:在虚表(vtbl)中,该函数的条目被标记为一个特殊值(通常是空指针或指向一个名为__pure_virtual_called的错误处理函数)。
  3. 强迫继承者:任何继承自此类的子类,除非它也想当抽象类,否则必须重写(Override)这个函数。

二、 抽象类的核心用途:解耦与接口设计

1. 定义接口(Interface)

在 C++03 中,虽然没有interface关键字,但我们通过“只包含纯虚函数的类”来模拟它。这让调用者(客户端)只依赖于抽象的协议,而不依赖于具体的实现。

2. 实现契约式编程

抽象类定义了“做什么”,而派生类定义了“怎么做”。这种分离使得系统具备了极强的扩展性。例如,你可以编写一个处理Storage对象的函数,无论是DiskStorage还是CloudStorage,只要它们遵循Storage的契约,代码就能完美运行。


三、 纯虚函数可以有“身体”吗?

这是一个经常被忽略的冷知识:在 C++ 中,你可以为纯虚函数提供定义。

classShape{public:virtualvoiddraw()=0;};// 纯虚函数的定义voidShape::draw(){std::cout<<"Performing common shape prep...";}

为什么要这么做?
虽然子类仍然必须重写draw(),但子类的实现可以显式地调用Shape::draw()来执行一些通用的初始化逻辑。这既保证了子类必须提供个性化实现,又提供了共享代码的机会。


四、 避坑指南:纯虚析构函数

正如我们在 No.013 聊过的,基类的析构函数必须是虚的。但如果你想把类变成抽象类,却又没有合适的成员函数可以纯虚化,该怎么办?

你可以把析构函数声明为纯虚的:

classBase{public:virtual~Base()=0;};// 必须提供定义!Base::~Base(){}

注意:你必须为纯虚析构函数提供函数体。因为子类析构时会自动向上调用基类析构函数,如果没有定义,程序在链接阶段会崩溃。


总结:架构师的指挥棒

  • 虚函数:提供默认方案,你可以改,也可以不改。
  • 纯虚函数:不提供默认方案(通常),你必须自己动手。
  • 抽象类:它是思想的化身,不是物理存在的实体。

下一篇预告:我们通常谈论public继承表示“是一个(Is-a)”的关系。但如果你使用private继承,这种血缘关系就会变得非常诡异。它不再是“是一个”,而是“用……实现”。

➡️《你真的了解C++吗》No.023:私有继承的哲学——“实现基于”而非“是一种”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 9:45:07

GLM-4.6V-Flash-WEB低延迟秘诀:GPU算力预加载实战

GLM-4.6V-Flash-WEB低延迟秘诀&#xff1a;GPU算力预加载实战 智谱最新开源&#xff0c;视觉大模型。 1. 引言&#xff1a;为何GLM-4.6V-Flash-WEB需要低延迟优化&#xff1f; 1.1 视觉大模型的实时性挑战 随着多模态AI应用的普及&#xff0c;用户对视觉大模型&#xff08;Vi…

作者头像 李华
网站建设 2026/4/18 7:51:56

基于VUE的校园超市与交流系统[VUE]-计算机毕业设计源码+LW文档

摘要&#xff1a;随着校园数字化建设的推进&#xff0c;校园超市作为学生日常消费的重要场所&#xff0c;其信息化管理与学生交流互动的需求日益凸显。本文介绍基于Vue框架开发的校园超市与交流系统&#xff0c;阐述其开发背景与意义&#xff0c;分析相关技术&#xff0c;详细说…

作者头像 李华
网站建设 2026/4/10 14:29:47

AI人脸隐私卫士技术深度:BlazeFace架构解析

AI人脸隐私卫士技术深度&#xff1a;BlazeFace架构解析 1. 技术背景与问题提出 在数字化时代&#xff0c;图像和视频内容的传播速度前所未有地加快。社交媒体、云相册、监控系统等场景中&#xff0c;人脸信息无处不在。然而&#xff0c;这种便利也带来了严重的隐私泄露风险。…

作者头像 李华
网站建设 2026/4/23 7:45:30

导师推荐!10款AI论文写作软件测评:本科生毕业论文必备

导师推荐&#xff01;10款AI论文写作软件测评&#xff1a;本科生毕业论文必备 2026年AI论文写作软件测评&#xff1a;为何需要这份榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的本科生在撰写毕业论文时开始借助AI写作工具提升效率。然而&#xff0c;市面…

作者头像 李华
网站建设 2026/4/17 18:15:53

骨骼动画生成教程:Stable Diffusion+姿态控制

骨骼动画生成教程&#xff1a;Stable Diffusion姿态控制 引言 作为一名独立游戏制作人&#xff0c;你是否遇到过这样的困境&#xff1a;想要为游戏角色设计丰富的动画&#xff0c;却苦于没有专业的动画制作团队&#xff1f;传统的骨骼动画制作不仅耗时费力&#xff0c;还需要…

作者头像 李华
网站建设 2026/4/12 18:31:47

没显卡怎么做骨骼关键点检测?云端GPU开箱即用,2块钱玩一下午

没显卡怎么做骨骼关键点检测&#xff1f;云端GPU开箱即用&#xff0c;2块钱玩一下午 引言 作为健身App的产品经理&#xff0c;你可能经常需要测试骨骼关键点检测功能&#xff0c;用来分析用户的运动姿势是否正确。但现实很骨感&#xff1a;公司没配GPU服务器&#xff0c;租云…

作者头像 李华