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

C++ 面向对象关键语法详解:override、虚函数、转发调用和数组引用传参-策略模式

int A(参数...) override {    return 某个对象.A(参数...);}

一.目标

本文将用一个简单的“数学运算器”例子,从零解释以下 C++ 语法特性:

  • virtual 虚函数

  • override 重写关键字

  • 函数体内部的“转发调用”

  • 数组引用作为函数参数

适合初学者和希望加深理解的 C++ 编程者

二.背景:做一个“多种运算器”系统

我们希望定义一个统一的接口来支持不同的数学运算(加法、乘法等),用户只需调用统一的 calculate() 函数,不必关心底层具体做了什么。

第1步:定义接口类(抽象基类)
class Calculator {
public:virtual int calculate(int a, int b, int (&results)[2]) = 0;
};

解释:

  • Calculator 是一个抽象类(或称接口类);

  • calculate() 是一个纯虚函数= 0);

  • 它接收两个整数 ab,并通过一个 长度为 2 的整型数组引用 results[2] 返回计算结果。

我们会让不同的“运算器”继承这个类,做不同的实现。

第2步:实现子类(加法器)
class Adder {
public:int calculate(int a, int b, int (&results)[2]) {results[0] = a + b;   // 存入和results[1] = a - b;   // 存入差,顺便展示多结果return 0;}
};

这个类实现了自己的 calculate(),返回值为 0 表示成功,计算和差分别存入 results[0]results[1]

第3步:写一个代理类(封装 Adder 实现)

现在我们写一个类,它继承自接口类 Calculator,但内部不直接做运算,而是把工作交给成员对象 Adder 完成

class AdderWrapper : public Calculator {Adder adder; // 组合成员public:int calculate(int a, int b, int (&results)[2]) override {return adder.calculate(a, b, results);}
};
代码含义
: public Calculator表示该类继承自 Calculator 接口
override明确声明我们在重写父类中的虚函数
int (&results)[2]表示这是一个“长度为 2 的整型数组引用”,可以被函数内部直接修改
return adder.calculate(...)将输入参数“原封不动”转发给成员对象 adder 的同名函数处理,这是函数转发

这段代码的含义是:"我作为一个符合接口的类,但我把实际工作交给了我的内部成员对象去做。

第4步:示例
#include <iostream>void runCalculation(Calculator* calc) {int results[2];calc->calculate(10, 5, results);std::cout << "和: " << results[0] << ", 差: " << results[1] << std::endl;
}int main() {AdderWrapper wrapper;runCalculation(&wrapper);return 0;
}

 运行结果:

和: 15, 差: 5

三.为什么用这种结构?

  • 模块化:逻辑封装在 Adder 内部,AdderWrapper 只负责接口对接;

  • 解耦合:可以轻松替换其他实现(如 Multiplier),而不改接口;

  • 可扩展:未来加新功能,只需添加新类即可;

  • 符合面向对象设计原则(依赖倒置、单一职责等);

四.完整示例代码

#include <iostream>// 1. 定义接口类(抽象基类)
class Calculator {
public:// 纯虚函数,要求子类必须实现virtual int calculate(int a, int b, int (&results)[2]) = 0;
};// 2. 实现一个功能类:Adder(加法器)
class Adder {
public:int calculate(int a, int b, int (&results)[2]) {results[0] = a + b;   // 存储加法结果results[1] = a - b;   // 存储减法结果(为了示例展示多个结果)return 0;             // 返回状态码:0 表示成功}
};// 3. 实现一个包装类:继承接口 + 转发调用
class AdderWrapper : public Calculator {Adder adder;  // 内部成员对象public:// 使用 override 关键字表示重写接口类的虚函数int calculate(int a, int b, int (&results)[2]) override {return adder.calculate(a, b, results);  // 转发调用给内部的 adder 对象}
};// 4. 使用者函数:统一调用接口类指针
void runCalculation(Calculator* calc) {int results[2];calc->calculate(10, 5, results);  // 调用接口函数std::cout << "和: " << results[0] << ", 差: " << results[1] << std::endl;
}// 5. 程序入口
int main() {AdderWrapper wrapper;runCalculation(&wrapper);  // 输出: 和: 15, 差: 5return 0;
}

--------------------------------------------------------------------------------------------------------------------------------

const & 说明它是只读引用,传入不会在函数里被修改。

相关文章:

C++ 面向对象关键语法详解:override、虚函数、转发调用和数组引用传参-策略模式

int A(参数...) override { return 某个对象.A(参数...);} 一.目标 本文将用一个简单的“数学运算器”例子&#xff0c;从零解释以下 C 语法特性&#xff1a; virtual 虚函数 override 重写关键字 函数体内部的“转发调用” 数组引用作为函数参数 适合初学者和希望加深…...

山东科技大学深度学习考试回忆

目录 一、填空&#xff08;五个空&#xff0c;十分&#xff09; 二、选择题(五个&#xff0c;十分&#xff09; 三、判断题&#xff08;五个&#xff0c;五分&#xff09; 四、论述题&#xff08;四个&#xff0c;四十分&#xff09; 五、计算题&#xff08;二个&#xff…...

sql server 学习计划

目标定位&#xff08;适用于开发人员、架构师、DBA&#xff09; 精通 SQL Server 的数据建模、T-SQL 编程、并发控制、性能优化、索引策略 掌握事务、锁机制、统计信息、执行计划 能独立完成复杂系统的数据库设计、调优与可用性设计 具备解决大数据量、高并发、长事务、数据…...

宇树机器狗go2—slam建图(1)点云格式

0.前言 上一篇番外文章教大家如何在宇树机器狗go2的gazebo仿真环境中实现简单的导航运动&#xff0c;本期文章会教大家如何让宇树的机器狗go2在仿真环境中进行slam建图时经常会遇到的一些点云格式&#xff0c;在后续的slam建图和slam算法解析的时候会经常与这些点云信息打交道…...

致远OA——自定义开发rest接口

文章目录 :apple: 业务流程 &#x1f34e; 业务流程 代码案例&#xff1a; https://pan.quark.cn/s/57fa808c823f 官方文档&#xff1a; https://open.seeyoncloud.com/seeyonapi/781/https://open.seeyoncloud.com/v5devCTP/39/783.html 登录系统 —— 后台管理 —— 切换系…...

No package docker-ce available问题的解决

安装docker时提示 rootk8s-node3 ~]# yum install -y docker-ce docker-ce-cli containerd.io Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com No packag…...

群晖威联通飞牛等nas如何把宿主机硬盘挂接到可道云docker容器中

可道云系统是用户常用的一款面向个人用户的轻量级私有云存储工具&#xff0c;以高效管理和安全存储为核心&#xff0c;打造便捷的数字化办公体验。但是用户希望把原有其他磁盘中文件挂接到这个新系统中有很大的难度,主要是对linux文件系统理解有很大的误区,认为目录结构是固定的…...

使用docker该怎么做:从公有仓库拉取镜像并上传到私有仓库

在容器化部署中&#xff0c;将公有镜像仓库&#xff08;如Docker Hub&#xff09;的镜像迁移到私有仓库&#xff08;如Harbor、Nexus&#xff09;是常见需求。 一、为什么需要将镜像从公有仓库传到私有仓库&#xff1f; 网络连通性&#xff1a;公有仓库依赖公网访问&#xff…...

软件开发指南——GUI 开发方案推荐

1. LVGL (Light and Versatile Graphics Library) 适用场景&#xff1a;嵌入式设备、资源受限环境 优势&#xff1a; 专为嵌入式设计的开源 GUI 库&#xff0c;内存占用极小&#xff08;最低仅需 64KB RAM&#xff09;支持触摸屏、硬件加速&#xff08;如 STM32 的 LTDC&…...

使用 Azure AKS 保护 Kubernetes 部署的综合指南

企业不断寻求增强其软件开发和部署流程的方法。DevOps 一直是这一转型的基石,弥合了开发与运营之间的差距。然而,随着安全威胁日益复杂,将安全性集成到 DevOps 流水线(通常称为 DevSecOps)已变得势在必行。本指南深入探讨了如何使用 Azure Kubernetes 服务 (AKS) 来利用 D…...

C#: 用Libreoffice实现Word文件转PDF

现实场景中要实现Word格式转PDF格式还是比较常见的。 如果要用开源的组件&#xff0c;只有用Libreoffice了。 一、下载安装Libreoffice 先进入如下链接&#xff0c;找到最新版本和匹配的操作系统来安装。 官网试过&#xff0c;下载是能下载&#xff0c;但安装了用不了&…...

Node.js 创建 HTTP 服务端

Node.js 创建 HTTP 服务端的用法总结&#xff0c;内容涵盖了 核心模块、基本用法、Express 简化用法、常见场景、错误处理、以及实用小贴士。 ✅ 一、Node.js 创建 HTTP 服务的方式 Node.js 使用内置的 http 模块即可快速创建一个 Web 服务&#xff0c;无需额外安装依赖。 ✅ …...

Uniapp:列表选择提示框

目录 一、出现场景二、效果展示三、具体使用 一、出现场景 在项目的开发过程中&#xff0c;有这样一种场景&#xff0c;就是点击按钮走后续的逻辑之前还需要选择前提条件&#xff0c;就一个条件的情况下如果使用弹出框就显示比较多余&#xff0c;列表选择提示框刚好能够满足我…...

【python】django sqlite版本过低怎么办

方法一&#xff1a;下载最新版本 复制上面的内容的链接 在服务器上进行操作 wget https://sqlite.org/2025/sqlite-autoconf-3490100.tar.gz tar -zxvf sqlite-autoconf-3490100.tar.gz cd sqlite-autoconf-3490100 ./configure --prefix/usr/local make && make in…...

山东大学软件学院创新项目实训开发日志(18)之对话自动生成标题设为用户第一次对话发的文字

本次功能的实现主要集中在后端&#xff0c;前端代码不用改变&#xff1a; 前端界面效果展示&#xff1a;...

【机器学习】PCA-奇异值分解-上采样与下采样-傅里叶变换

1. PCA 主成分分析 主成分分析&#xff08;PCA&#xff09;是一种常用的数据降维方法。 它通过找到数据中方差最大的方向&#xff08;主成分&#xff09;&#xff0c;将原始高维数据映射到较低维空间&#xff0c;同时尽可能保留原始信息。 数学实现上&#xff0c;通常通过协方…...

[图论]生成树 引言

生成树 引言 生成树&#xff1a;一个连通图的生成树是该图的一个极小连通子图。生成树中含有图中全部(设 V V V个)顶点及构成一棵树的 V − 1 V-1 V−1条边&#xff0c;且生成树中不应有环。最小生成树(MST)&#xff1a;图的所有生成树中&#xff0c;边权之和最小的生成树。显…...

前端与Java后端交互出现跨域问题的14种解决方案

跨域问题是前端与后端分离开发中的常见挑战&#xff0c;以下是14种完整的解决方案&#xff1a; 1 前端解决方案( 开发环境代理) 1.1 Webpack开发服务器代理 // vue.config.js 或 webpack.config.js module.exports {devServer: {proxy: {/api: {target: http://localhost:8…...

【day8】调用AI接口,生成自动化测试用例

1、项目结构建议 project/ ├── api_docs/ # 存放接口文档 │ └── XX系统.swagger.json ├── ai_generator/ # AI测试用例生成模块 │ └── test_case_generator.py ├── tests/ # 生成的测试用例 │ └── test_user_api.py ├── conftest.py # pytest配置 ├─…...

C#中同步任务和异步任务

同步任务和异步任务在编程中各有其独特的优缺点 同步任务 优点 逻辑简单清晰&#xff1a;同步任务的执行流程与代码编写顺序一致&#xff0c;依次执行各个操作&#xff0c;开发者无需考虑复杂的异步回调、任务状态管理等问题&#xff0c;代码的逻辑和执行顺序易于理解和调试…...

多人3D游戏完整实现方案

以下是一份完整的代码实现方案,涵盖架构设计、核心模块实现和部署流程。我们以 多人3D游戏 为例,结合之前讨论的Nano服务端框架和Unity客户端: 技术栈 模块技术选型服务端Golang + Nano框架 + MongoDB客户端Unity 2022 + C# + Mirror Networking通信协议Protobuf + WebSock…...

【sylar-webserver】8 HOOK模块

文章目录 知识点HOOK实现方式非侵入式hook侵入式hook ⭐⭐⭐ 覆盖系统调用接口获取被全局符号介入机制覆盖的系统调用接口 具体实现FdCtx 和 FdManagerconnect hookdo_io模板 在写之前模块的时候&#xff0c;我一直在困惑 协程是如何高效工作的&#xff0c;毕竟协程阻塞线程也就…...

【Tauri2】026——Tauri+Webassembly

前言 不多废话 直言的说&#xff0c;笔者看到这篇文章大佬的文章 【04】Tauri 入门篇 - 集成 WebAssembly - 知乎https://zhuanlan.zhihu.com/p/533025312尝试集成一下WebAssembly&#xff0c;直接开始 正文 准备工作 新建一个项目 安装 vite的rsw插件和rsw pnpm instal…...

Notepad++中将文档格式从Windows(CR LF)转换为Unix(LF)

在Windows中用记事本写了一个.sh的Linux运行脚本&#xff0c;是无法直接在Linux中执行&#xff0c;需要首先把文本编码格式转换为Unix的&#xff0c;特别是换行符这些&#xff0c;转换步骤如下&#xff1a; 1、打开文档 在Notepad中打开需要转换的文件。 2、进入文档格式转换…...

Linux常见工具如yum、vim、gcc、gdb的基本使用,以及编译过程和动静态链接的区别

目录 一、工具的本质 二、一些常用的工具 1.yum 2.vim 1&#xff09;vim的三种基本模式&#xff1a; 2&#xff09;vim的基本操作 ①命令模式下的基本操作&#xff1a; ②插入模式&#xff1a; ③底行模式&#xff1a; 3&#xff09;vim的配置&#xff1a;让他变得更好用 3.gcc…...

【HDFS】EC重构过程中的校验功能:DecodingValidator

一、动机 DecodingValidator是在HDFS-15759中引入的一个用于校验EC数据重构正确性的组件。 先说下引入DecodingValidator的动机,据很多已知的ISSUE(如HDFS-14768, HDFS-15186, HDFS-15240,这些目前都已经fix了)反馈, EC在重构的时候可能会有各种各样的问题,导致数据错误…...

【SAP ME 44】在 HANA DB中报废SFC时的SHOP_ORDER表记录锁定

症状 SELECT…FROM SHOP_ORDER FOR UPDATE 在 SFC 报废期间持有锁,当同时调用数量较大时,可能会导致 HANA 数据库出现大量锁积压。这有时会导致因等待 HANA 数据库释放“选择更新”锁而导致报废 SFC 花费数分钟。 HANA 数据库日志中的示例: # begin PreparedStatement_ex…...

企业级Keepalived高可用离线部署实战(附K8S集群VIP配置)

企业级Keepalived高可用离线部署实战&#xff08;附K8S集群VIP配置&#xff09; 摘要&#xff1a;本文详细讲解在离线环境下部署Keepalived实现Kubernetes集群高可用的完整流程&#xff0c;涵盖源码编译安装、多节点配置、健康检查联动等核心环节&#xff0c;并提供生产级参数…...

RBAC的使用

1、简述RBAC的作用及工作流程 Rbac基于角色访问控制&#xff0c;用于管理用户对集群资源的访问权限&#xff0c;通过定义角色和绑定规则&#xff0c;将用户与权限进行关联&#xff0c;作用&#xff1a;权限精细化管理&#xff0c;操作便捷与统一管理&#xff0c;动态调整权限。…...

MySQL+Redis实战教程:从Docker安装部署到自动化备份与数据恢复20250418

MySQLRedis实战教程&#xff1a;从Docker安装部署到自动化备份与数据恢复 一、前言 在企业应用中&#xff0c;对MySQL和Redis运维的要求越来越高&#xff1a; 不能仅是启动就算部署运行稳定、隔离、访问控制、备份恢复、安全可靠&#xff0c;才是 企业级的基本功能 本文将手…...