C++学习笔记----9、发现继承的技巧(二)---- 重用目的的继承
现在你对继承的基本语法已经比较熟悉了,是时候探索继承是c++语言中重要属性的一个主要原因了。继承是一个装备允许你平衡既有代码。本节会举出基于代码重用目的的继承的例子。
1、WeatherPrediction类
假想你有一个任务,写一个程序来发出简单的天气预报,要用华氏度与摄氏度。作为程序员天气预报可能有一点儿超出你的领域,所以包含一个基于当前温度与当前金星与火星之间的距离写来用于天气预报的第三方的类库。第三方包用编译好的库进行分发,是为了保护预报算法的知识产权,但是你可以看到类定义。weather_prediction模块接口文件如下:
export module weather_prediction;import std;// Predicts the weather using proven new-age techniques given the current
// temperature and the distance from Jupiter to Mars. If these values are
// not provided, a guess is still given but it's only 99% accurate.
export class WeatherPrediction
{
public:// Virtual destructorvirtual ~WeatherPrediction();// Sets the current temperature in Fahrenheitvirtual void setCurrentTempFahrenheit(int temp);// Sets the current distance between Jupiter and Marsvirtual void setPositionOfJupiter(int distanceFromMars);// Gets the prediction for tomorrow's temperaturevirtual int getTomorrowTempFahrenheit() const;// Gets the probability of rain tomorrow. 1 means// definite rain. 0 means no chance of rain.virtual double getChanceOfRain() const;// Displays the result to the user in this format:// Result: x.xx chance. Temp. xxvirtual void showResult() const;// Returns a string representation of the temperaturevirtual std::string getTemperature() const;private:int m_currentTempFahrenheit{ 0 };int m_distanceFromMars{ 0 };
};
注意该类将所有的成员函数都标识为virtual,因为该类假定它们会在继承类中被重载。
该类解决了程序的大部分问题。然而,通常情况下就是这样,这并没有准确地完成你的需求。首先,所有的温度都是以华氏度给的。你和应用程序需要以摄氏度运行。还有,showResult()成员函数可能不是你想要的结果显示的方式。
2、在继承类中添加功能
在学习继承时,添加功能是描述的第一个技巧。本质上,你的程序需要的就是像WeatherPrediction类但是还要有一些额外的华丽的点缀。听起来像是一个重用代码的继承的好的案例。我们先开始定义一个新的类,MyWeatherPrediction,它继承自WeatherPrediction:
import weather_prediction;
export class MyWeatherPrediction : public WeatherPrediction
{
};
前面的类定义编译没有问题,MyWeatherPrediction类可以用于WeatherPrediction的位置。它提供了同样的功能,但是还没有任何新意。第一次修改,你可能想添加类的摄氏度的知识。你可能有一点儿左右为难,因为你不知道类内部是怎么做的。如果所有的内部计算都用的是华氏的,你怎么加上摄氏度的支持呢?一个方法是使用继承类做为中间商,在用户之间交互,谁能用什么度,基类呢,只能理解华氏度。
支持摄氏度的第一步就是添加成员函数允许客户设置以摄氏度而不是华氏度的当前温度,来得到明天的预报,以摄氏度而不是华氏度。你还需要私有的辅助函数来双向转换摄氏度与华氏度。这些函数可以是静态的,因为对于类实例是一样的。
export class MyWeatherPrediction : public WeatherPrediction
{
public:virtual void setCurrentTempCelsius(int temp);virtual int getTomorrowTempCelsius() const;
private:static int convertCelsiusToFahrenheit(int celsius);static int convertFahrenheitToCelsius(int fahrenheit);
};
新的成员函数与父类的命名规则保持一致。记住从其它代码的角度,MyWeatherPrediction对象有所有的定义在MyWeatherPrediction与WeatherPrediction中的功能。适应父类的命名规范提供了一致的接口。
华氏度与摄氏度的转换留给大家去做吧,实在做不来,上网上搜一下也能获取!另两个成员函数就比较有趣了。用摄氏度设置当着温度,需要首先转换温度,然后用它能理解的单位给到父类:
void MyWeatherPrediction::setCurrentTempCelsius(int temp)
{int fahrenheitTemp{ convertCelsiusToFahrenheit(temp) };setCurrentTempFahrenheit(fahrenheitTemp);
}
可以看到,一旦温度被转换,就可以调用基类的既有的功能。同样的,getTomorrowTempCelsius()的实现使用父类既有的功能去获得华氏度温度,但是在返回之前转换一下结果:
int MyWeatherPrediction::getTomorrowTempCelsius() const
{int fahrenheitTemp{ getTomorrowTempFahrenheit() };return convertFahrenheitToCelsius(fahrenheitTemp);
}
两个新的成员函数高效重用了父类,因为它们“打包”既有的功能,用一种提供了新的接口的方式来使用它。
也可以添加新功能与父类既有的功能毫无关系。例如,可以添加一个成员函数来从互联网上访问另外的预报,或者一个成员函数基于预报的天气建议相关活动。
3、在继承类中替换功能
继承的另外的主要技术是替换既有的功能。在WeatherPrediction类中的showResult()成员函数急需整容。MyWeatherPrediction可以重载成员函数来用它自己的实现替换它的行为。
新的MyWeatherPredition类定义如下:
export class MyWeatherPrediction : public WeatherPrediction
{
public:virtual void setCurrentTempCelsius(int temp);virtual int getTomorrowTempCelsius() const;void showResult() const override;private:static int convertCelsiusToFahrenheit(int celsius);static int convertFahrenheitToCelsius(int fahrenheit);
};
下面是一个新的,用户更友好的重载showResult()成员函数的实现:
void MyWeatherPrediction::showResult() const
{println("Tomorrow will be {} degrees Celsius ({} degrees Fahrenheit)",getTomorrowTempCelsius(), getTomorrowTempFahrenheit());println("Chance of rain is {}%", getChanceOfRain() * 100);if (getChanceOfRain() > 0.5) {println("Bring an umbrella!");}
}
对于使用这个类的客户,就像旧版本的showResult()从来没有存在过。只要对象是MyWeatherPrediction,就会调用新的版本。作为这些改变的结果,MyWeatherPrediction作为一个带有新功能适应更确定的目的的新类出现。但是,它并不需要太多的代码,因为它利用了基类的既有的功能。
相关文章:
C++学习笔记----9、发现继承的技巧(二)---- 重用目的的继承
现在你对继承的基本语法已经比较熟悉了,是时候探索继承是c语言中重要属性的一个主要原因了。继承是一个装备允许你平衡既有代码。本节会举出基于代码重用目的的继承的例子。 1、WeatherPrediction类 假想你有一个任务,写一个程序来发出简单的天气预报&a…...
锐评 Nodejs 设计模式 - 创建与结构型
本系列文章的思想,都融入了 让 Java 再次伟大 这个全新设计的脚手架产品中,欢迎大家使用。 单例模式与模块系统 Node 的单例模式既特殊又简单——凡是从模块中导出的实例天生就是单例。 // database.js function Database(connect, account, password)…...

【RoadRunner】自动驾驶模拟3D场景构建 | 软件简介与视角控制
💯 欢迎光临清流君的博客小天地,这里是我分享技术与心得的温馨角落 💯 🔥 个人主页:【清流君】🔥 📚 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 📚 🌟始终保持好奇心&…...

15分钟学Go 第4天:Go的基本语法
第4天:基本语法 在这一部分,将讨论Go语言的基本语法,了解其程序结构和基础语句。这将为我们后续的学习打下坚实的基础。 1. Go语言程序结构 Go语言程序的结构相对简单,主要包括: 包声明导入语句函数语句 1.1 包声…...

【Qt】Qt的介绍——Qt的概念、使用Qt Creator新建项目、运行Qt项目、纯代码方式、可视化操作、认识对象模型(对象树)
文章目录 Qt1. Qt的概念2. 使用Qt Creator新建项目3. 运行Qt项目3.1 纯代码方式实现3.2 可视化操作实现 4. 认识对象模型(对象树) Qt 1. Qt的概念 Qt 是一个跨平台的 C 图形用户界面应用程序开发框架。它是软件开发者提供的用于界面开发的程序框架&#…...

论文笔记:PTR: Prompt Tuning with Rules for Text Classification
Abstract 手动设计大量语言提示麻烦且易出错,而自动生成的提示,在非小样本场景下验证其有效性昂贵且耗时。因此,提示调优以处理多类别分类任务仍然具有挑战。为此,本文提出使用规则进行多类别文本分类提示调优(PTR&…...
服务器和中转机协同工作以提高网络安全
服务器和中转机(代理服务器)可以通过多种方式协同工作来提高网络安全。 常见的协同工作策略: 1. 使用代理服务器作为安全网关 访问控制:代理服务器可以作为网络的入口点,实施访问控制策略,如基于IP地址、…...

Java利用itextpdf实现pdf文件生成
前言 最近公司让写一个数据页面生成pdf的功能,找了一些市面代码感觉都太麻烦,就自己综合性整合了一个便捷的工具类,开发只需简单组装数据直接调用即可快速生成pdf文件。望大家一起学习!!! 代码获取方式&am…...

2010年国赛高教杯数学建模C题输油管的布置解题全过程文档及程序
2010年国赛高教杯数学建模 C题 输油管的布置 某油田计划在铁路线一侧建造两家炼油厂,同时在铁路线上增建一个车站,用来运送成品油。由于这种模式具有一定的普遍性,油田设计院希望建立管线建设费用最省的一般数学模型与方法。 1. 针对两炼…...

datawhale大模型bot应用开发--task3:工作流
目录 一、介绍:Coze工作流 1.1工作流应用场景 1.2什么是工作流 1.3思考环节 二、各个工作流详情 2.1情感分类工作流 2.2 随机数工作流 2.3 必应搜索工作流 2.4 天气查询工作流 三、集合上面五个工作流的总工作流 一、介绍:Coze工作流 1.1工作…...

期货配资系统风控逻辑开发/完整源代码
期货配资系统风控逻辑的开发是确保系统安全、稳定、高效运行的关键环节。以下是对期货配资系统风控逻辑开发的详细分析: 一、风险识别与评估 风险来源分析: 市场风险:期货市场价格波动带来的风险。信用风险:投资者或配资方违约的…...

汽车免拆诊断案例 | 2023款零跑C01纯电车后备厢盖无法电动打开和关闭
故障现象 一辆2023款零跑C01纯电车,累计行驶里程约为2万km,车主进厂反映,后备厢盖无法电动打开和关闭。 故障诊断 接车后试车,操作后备厢盖外侧、驾驶人侧及遥控钥匙上的后备厢盖开启按钮,可以听到后备厢盖解锁的…...
分布式存储架构 与分布式一致性协议
分布式存储架构可以分为无中心节点架构和有中心节点架构。它们的设计在系统中的角色分配、数据管理、协调方式等方面有所不同。 1. 无中心节点架构(Decentralized/Peer-to-Peer Architecture) 在无中心节点的分布式存储架构中,所有节点都是…...

Unity Apple Vision Pro 保姆级开发教程 - Simulator 模拟器使用
教程视频 Apple VisionPro Simulator 模拟器使用教程 VsionOS Simulator 简介 visionOS Simulator 是一个用于开发和测试 visionOS 应用程序的工具。它模拟 Apple Vision Pro 的运行环境,帮助开发者在没有硬件设备的情况下创建、调试和优化他们的应用程序。VisionO…...
Vue 之 插件与组件的区别
在 Vue.js 中,插件(Plugin)和组件(Component)都是用来扩展 Vue 功能的重要工具,但它们的应用场景和使用方式有所不同。本文将通过对比的方式,帮助开发者更好地理解两者的区别,并通过…...

了解 ChatGPT 中的公平性问题
了解 ChatGPT 中的公平性问题 最近,OpenAI 又发布了一篇新的博客。他们谈论了一个有趣又重要的话题——用户的身份如何影响 ChatGPT 的回答。 这项研究揭示了一个鲜明的事实,那就是 AI 可能会无意间对人类产生刻板印象。很可能这些刻板印象源自 AI 训练过程中使用的数据,而这…...
【PHP】安装swoole时报错:No package ‘libbrotlienc‘ found
一、环境 Debian 11(bullseye) PHP 8.2.14 Swoole 5.1.4 二、过程 今天在安装Swoole 5.1.4的时候报错,错误信息如下: configure: error: Package requirements (libbrotlienc) were not met:No package libbrotlienc foundConsider adjusting the PK…...

postgresql执行计划解读案例
简介 SQL优化中读懂执行计划尤其重要,以下举例说明在执行计划中常见的参数其所代表的含义。 创建测试数据 -- 创建测试表 drop table if exists customers ; drop table if exists orders ; drop table if exists order_items ; drop table if exists products ;…...

Matlab实现粒子群优化算法优化随机森林算法模型 (PSO-RF)(附源码)
目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 粒子群优化算法(PSO)是一种启发式搜索方法,灵感来源于鸟类群体觅食的行为。在PSO中,每个解都是搜索空间中的一个“粒子”,这些粒子以一定的速度飞行&am…...
使用 EasyExcel 相邻数据相同时行和列的合并,包括动态表头、数据
前言 在处理 Excel 文件时,经常会遇到需要对表格中的某些单元格进行合并的情况,例如合并相同的行或列。Apache POI 是一个强大的工具,但它使用起来相对复杂。相比之下,EasyExcel 是一个基于 Apache POI 的轻量级 Excel 处理库&am…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...