『 C++ 』中不可重写虚函数的实用案例
文章目录
- 框架设计:保障核心逻辑稳定
- 避免误操作:防止逻辑混乱
- 确保接口一致:库与API设计
在C++编程里,用final关键字修饰、不允许被继承(重写)的虚函数其实很有用。接下来我就结合实际案例,给大家讲讲它的用途。
框架设计:保障核心逻辑稳定
在设计大型软件框架时,有些虚函数代表着框架的核心逻辑。为了保证框架稳定、不出错,我们不希望这些核心逻辑被派生类修改。就拿图形绘制框架来说吧。
#include <iostream>// 图形基类
class Shape {
public:// 绘制图形的核心逻辑,不允许派生类重写virtual void draw() final {std::cout << "Base drawing logic..." << std::endl;specificDraw();}// 留给派生类实现的特定绘制逻辑virtual void specificDraw() = 0;virtual ~Shape() {}
};// 圆形类
class Circle : public Shape {
public:void specificDraw() override {std::cout << "Drawing a circle..." << std::endl;}
};// 矩形类
class Rectangle : public Shape {
public:void specificDraw() override {std::cout << "Drawing a rectangle..." << std::endl;}
};int main() {Shape* circle = new Circle();circle->draw();Shape* rectangle = new Rectangle();rectangle->draw();delete circle;delete rectangle;return 0;
}
在这个例子中,Shape类的draw函数是核心绘制逻辑,用final修饰后,派生类就没法重写它。这样能保证绘制图形时,总会先执行基类定义的通用绘制逻辑。而specificDraw是纯虚函数,留给派生类实现特定的绘制逻辑。这就好比盖房子,基类的通用逻辑是房子的框架,必须稳定,而派生类的特定逻辑是房子里的装修,可以根据需求定制。
避免误操作:防止逻辑混乱
在复杂的类继承体系中,派生类可能会意外重写某些关键虚函数,导致逻辑混乱。使用final就能避免这种情况。下面是一个文件操作类的例子。
#include <iostream>// 文件操作基类
class FileOperator {
public:// 打开文件的操作,不允许派生类重写virtual void openFile() final {std::cout << "Opening file with standard procedure..." << std::endl;// 这里可以包含一些固定的文件打开逻辑specificOpen();}// 留给派生类实现的特定打开逻辑virtual void specificOpen() = 0;virtual ~FileOperator() {}
};// 文本文件操作类
class TextFileOperator : public FileOperator {
public:void specificOpen() override {std::cout << "Setting text file encoding..." << std::endl;}
};// 二进制文件操作类
class BinaryFileOperator : public FileOperator {
public:void specificOpen() override {std::cout << "Checking binary file header..." << std::endl;}
};int main() {FileOperator* textFile = new TextFileOperator();textFile->openFile();FileOperator* binaryFile = new BinaryFileOperator();binaryFile->openFile();delete textFile;delete binaryFile;return 0;
}
FileOperator类的openFile函数包含标准的文件打开流程,用final修饰后,能防止派生类意外修改这个关键流程。而specificOpen作为纯虚函数,让不同类型的文件操作类可以实现自己特定的打开逻辑。这就像工厂的生产流程,核心流程不能变,不同产品可以有自己的特殊处理环节。
确保接口一致:库与API设计
在设计库或者API时,为了保证接口一致,有些虚函数的实现需要固定下来。比如网络通信库的基类。
#include <iostream>// 网络通信基类
class NetworkCommunicator {
public:// 建立连接的操作,不允许派生类重写virtual void establishConnection() final {std::cout << "Establishing network connection with standard protocol..." << std::endl;// 可以包含一些固定的连接建立逻辑specificConnection();}// 留给派生类实现的特定连接逻辑virtual void specificConnection() = 0;virtual ~NetworkCommunicator() {}
};// TCP通信类
class TCPCommunicator : public NetworkCommunicator {
public:void specificConnection() override {std::cout << "Configuring TCP parameters..." << std::endl;}
};// UDP通信类
class UDPCommunicator : public NetworkCommunicator {
public:void specificConnection() override {std::cout << "Setting up UDP socket..." << std::endl;}
};int main() {NetworkCommunicator* tcpComm = new TCPCommunicator();tcpComm->establishConnection();NetworkCommunicator* udpComm = new UDPCommunicator();udpComm->establishConnection();delete tcpComm;delete udpComm;return 0;
}
NetworkCommunicator类的establishConnection函数定义了标准的网络连接建立流程,用final保证了所有派生类在建立连接时遵循相同的基本步骤。specificConnection作为纯虚函数,让不同的通信协议类可以实现自己特定的连接逻辑。这就像不同的交通工具都要遵循交通规则出发,但每种交通工具又有自己的驾驶方式。
总的来说,不被继承的虚函数在保证核心逻辑稳定、避免误操作以及确保接口一致等方面都有重要作用,是C++编程中一个实用的特性。
相关文章:
『 C++ 』中不可重写虚函数的实用案例
文章目录 框架设计:保障核心逻辑稳定避免误操作:防止逻辑混乱确保接口一致:库与API设计 在C编程里,用final关键字修饰、不允许被继承(重写)的虚函数其实很有用。接下来我就结合实际案例,给大家讲…...
Redis - String相关命令
目录 setgetmsetmgetsetnx、setex、psetexincr、incrby、decr、decrby、incrbyfloatappendgetrangesetrangestrlen字符串类型编码方式总结 Redis - String Redis存储的字符串,是直接按二进制方式存储,不会做任何编码转换,存的是什么ÿ…...
pytorch基于FastText实现词嵌入
FastText 是 Facebook AI Research 提出的 改进版 Word2Vec,可以: ✅ 利用 n-grams 处理未登录词 比 Word2Vec 更快、更准确 适用于中文等形态丰富的语言 完整的 PyTorch FastText 代码(基于中文语料),包含࿱…...
3D人脸建模:高精度3D人脸扫描设备快速生成真人脸部3D模型
什么是3D人脸建模? 3D人脸建模,即借助特定技术手段,获取人脸三维数据,并构建出能精准呈现人脸形状、纹理等特征的三维模型。这一技术广泛应用于计算机视觉、人机交互、虚拟现实、影视制作等多个领域,为各行业都带来了前所未有的创…...
4.PPT:日月潭景点介绍【18】
目录 NO1、2、3、4 NO5、6、7、8 NO9、10、11、12 表居中或者水平/垂直居中单元格内容居中或者水平/垂直居中 NO1、2、3、4 新建一个空白演示文稿,命名为“PPT.pptx”(“.pptx”为扩展名)新建幻灯片 开始→版式“PPT_素材.doc…...
冷链监控系统
前后端源码 wx :bright12389 冷链系统需求分析 1. 项目背景 冷链系统用于监控和管理冷链物流过程中的环境参数(如温度、湿度),确保货物在运输、存储过程中的质量安全。系统需支持实时监控、历史数据分析、异常告警等功能。 2.…...
VSCode中代码颜色异常
检查右下角语言模式是否是HTML, 如果不是就点击更改为HTML模式即可...
表格标签的使用
一.表格标签 1.1表格标签的作用 用来显示和展示数据,不是用来布局页面的。 1.2表格的基本语法 <table> //用于定义表格标签 <tr> // table row 用于定义表格中的行,必须嵌套在<table> </table>标签中 <td>单元格内的文…...
llama.cpp GGUF 模型格式
llama.cpp GGUF 模型格式 1. Specification1.1. GGUF Naming Convention (命名规则)1.1.1. Validating Above Naming Convention 1.2. File Structure 2. Standardized key-value pairs2.1. General2.1.1. Required2.1.2. General metadata2.1.3. Source metadata 2.2. LLM2.2.…...
嵌入式硬件篇---HAL库内外部时钟主频锁相环分频器
文章目录 前言第一部分:STM32-HAL库HAL库编程优势1.抽象层2.易于上手3.代码可读性4.跨平台性5.维护和升级6.中间件支持 劣势1.性能2.灵活性3.代码大小4.复杂性 直接寄存器操作编程优势1.性能2.灵活性3.代码大小4.学习深度 劣势1.复杂性2.可读性3.可维护性4.跨平台性…...
【IoCDI】_@Bean的参数传递
目录 1. 不创建参数类型的Bean 2. 创建一个与参数同类型同名的Bean 3. 创建多个与参数同类型,其中一个与参数同名的Bean 4. 创建一个与参数同类型不同名的Bean 5. 创建多个与参数同类型但不同名的Bean 对于Bean修饰的方法,也可能需要从外部传参&…...
[特殊字符] ChatGPT-4与4o大比拼
🔍 ChatGPT-4与ChatGPT-4o之间有何不同?让我们一探究竟! 🚀 性能与速度方面,GPT-4-turbo以其优化设计,提供了更快的响应速度和处理性能,非常适合需要即时反馈的应用场景。相比之下,G…...
【模型】Bi-LSTM模型详解
1. 模型架构与计算过程 Bi-LSTM 由两个LSTM层组成,一个是正向LSTM(从前到后处理序列),另一个是反向LSTM(从后到前处理序列)。每个LSTM单元都可以通过门控机制对序列的长期依赖进行建模。 1. 遗忘门 遗忘…...
directx12 3d开发过程中出现的报错 一
报错:“&”要求左值 “& 要求左值” 这个错误通常是因为你在尝试获取一个临时对象或者右值的地址,而 & 运算符只能用于左值(即可以放在赋值语句左边的表达式,代表一个可以被引用的内存位置)。 可能出现错…...
Ubuntu 24.04 安装 Poetry:Python 依赖管理的终极指南
Ubuntu 24.04 安装 Poetry:Python 依赖管理的终极指南 1. 更新系统包列表2. 安装 Poetry方法 1:使用官方安装脚本方法 2:使用 Pipx 安装 3. 配置环境变量4. 验证安装5. 配置 Poetry(可选)设置虚拟环境位置配置镜像源 6…...
读写锁: ReentrantReadWriteLock
在多线程编程场景中,对共享资源的访问控制极为关键。传统的锁机制在同一时刻只允许一个线程访问共享资源,这在读写操作频繁的场景下,会因为读操作相互不影响数据一致性,而造成不必要的性能损耗。ReentrantReadWriteLock࿰…...
上海路网道路 水系铁路绿色住宅地工业用地面图层shp格式arcgis无偏移坐标2023年
标题和描述中提到的资源是关于2023年上海市地理信息数据的集合,主要包含道路、水系、铁路、绿色住宅区以及工业用地的图层数据,这些数据以Shapefile(shp)格式存储,并且是适用于ArcGIS软件的无偏移坐标系统。这个压缩包…...
爬虫学习笔记之Robots协议相关整理
定义 Robots协议也称作爬虫协议、机器人协议,全名为网络爬虫排除标准,用来告诉爬虫和搜索引擎哪些页面可以爬取、哪些不可以。它通常是一个叫做robots.txt的文本文件,一般放在网站的根目录下。 robots.txt文件的样例 对有所爬虫均生效&#…...
Python小游戏29乒乓球
import pygame import sys # 初始化pygame pygame.init() # 屏幕大小 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("打乒乓球") # 颜色定义 WHITE (255, 255, 255) BLACK (…...
220.存在重复元素③
目录 一、题目二、思路三、解法四、收获 一、题目 给你一个整数数组 nums 和两个整数 indexDiff 和 valueDiff 。 找出满足下述条件的下标对 (i, j): i ! j, abs(i - j) < indexDiff abs(nums[i] - nums[j]) < valueDiff 如果存在,返回 true &a…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...
