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…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...
轻量安全的密码管理工具Vaultwarden
一、Vaultwarden概述 Vaultwarden主要作用是提供一个自托管的密码管理器服务。它是Bitwarden密码管理器的第三方轻量版,由国外开发者在Bitwarden的基础上,采用Rust语言重写而成。 (一)Vaultwarden镜像的作用及特点 轻量级与高性…...
