c++总复习

  1. C++ 中多态性在实际项目中的应用场景
    • 图形绘制系统
      • 描述:在一个图形绘制软件中,可能有多种图形,如圆形、矩形、三角形等。这些图形都有一个共同的操作,比如绘制(draw)。通过多态性,可以定义一个基类Shape,其中有一个纯虚函数draw。然后,CircleRectangleTriangle等派生类分别实现自己的draw函数。
      • 代码示例
class Shape {
public:virtual void draw() = 0;
};
class Circle : public Shape {
public:void draw() override {// 绘制圆形的具体代码std::cout << "Drawing a circle." << std::endl;}
};
class Rectangle : public Shape {
public:void draw() override {// 绘制矩形的具体代码std::cout << "Drawing a rectangle." << std::endl;}
};
  • 优势:当需要绘制一系列图形时,可以将这些图形对象存储在一个Shape指针数组中。然后通过遍历数组,调用每个对象的draw函数,而不需要为每种图形单独编写绘制代码。这样可以使代码结构更加清晰,易于维护和扩展。如果要添加新的图形,只需要创建一个新的派生类并实现draw函数即可。
  • 设备驱动程序开发
    • 描述:在操作系统的设备驱动开发中,不同的设备(如打印机、扫描仪、硬盘等)有不同的操作方式。可以定义一个基类Device,其中有虚函数如openclosereadwrite等。不同设备的驱动程序类(如PrinterScannerHardDisk)作为派生类,根据设备的具体特性实现这些虚函数。
    • 代码示例(简化)
class Device {
public:virtual bool open() = 0;virtual bool close() = 0;virtual size_t read(char* buffer, size_t size) = 0;virtual size_t write(const char* data, size_t size) = 0;
};
class Printer : public Device {
public:bool open() override {// 打开打印机的具体代码return true;}bool close() override {// 关闭打印机的具体代码return true;}size_t read(char* buffer, size_t size) override {// 打印机一般不进行读取操作,返回0return 0;}size_t write(const char* data, size_t size) override {// 打印数据的具体代码return size;}
};
  • 优势:操作系统可以使用统一的接口来处理不同的设备。例如,在一个文件读写操作的函数中,它可以接收一个Device指针。根据实际传入的是打印机、扫描仪还是硬盘的对象指针,会调用相应设备的readwrite函数。这使得操作系统的设备管理模块能够以一种通用的方式与各种设备进行交互,提高了代码的复用性和可维护性。
  • 游戏开发中的角色行为
    • 描述:在游戏中,不同的角色有不同的行为。例如,战士、法师、刺客等角色都有攻击(attack)行为,但他们的攻击方式不同。可以定义一个基类Character,其中有一个虚函数attack。每个角色类(如WarriorMageAssassin)作为派生类,实现自己的attack函数。
    • 代码示例(简化)
class Character {
public:virtual void attack() = 0;
};
class Warrior : public Character {
public:void attack() override {// 战士攻击的具体代码,可能是近身物理攻击std::cout << "Warrior attacks with a sword." << std::endl;}
};
class Mage : public Character {
public:void attack() override {// 法师攻击的具体代码,可能是释放魔法std::cout << "Mage casts a spell." << std::endl;}
};
  • 优势:游戏中的战斗场景可以通过一个Character指针数组来管理角色。在战斗循环中,遍历数组并调用每个角色的attack函数,实现不同角色的攻击行为。这样可以方便地添加新的角色类型,并且在游戏逻辑处理上更加灵活,代码的组织结构也更加合理。

  1. C++ 中面向对象编程实现数据隐藏的方法
    • 使用类的访问限定符(private、protected、public)
      • 描述:在 C++ 中,private访问限定符用于限制类的成员(数据成员和成员函数)只能在类的内部访问。例如,定义一个Person类,其中有一个age数据成员,将其设为private,外部代码就不能直接访问这个成员。
      • 代码示例
class Person {
private:int age;
public:void setAge(int a) {if (a > 0) {age = a;}}int getAge() {return age;}
};
  • 原理:通过将age设为private,只能通过类提供的setAgegetAge函数来间接访问和修改age的值。这样可以在setAge函数中添加数据验证逻辑,保证age的值符合一定的规则(如年龄不能为负数)。外部代码无法绕过这些函数直接操作age,从而实现了数据隐藏和封装。
  • 使用友元函数和友元类(谨慎使用)
    • 描述:友元函数和友元类可以访问类的privateprotected成员。虽然这看起来好像破坏了数据隐藏,但在某些特定情况下是有用的。例如,定义一个Date类和一个DateUtil类,DateUtil类中的某些函数可能需要直接访问Date类的内部成员来进行日期计算等操作。
    • 代码示例
class Date {
private:int year;int month;int day;friend class DateUtil;
};
class DateUtil {
public:bool isLeapYear(const Date& d) {// 直接访问Date类的year成员进行判断if ((d.year % 4 == 0 && d.year % 100!= 0) || (d.year % 400 == 0)) {return true;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/62899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pip离线安装一个github仓库

要使用pip安装一个本地Git仓库&#xff0c;你可以按照以下步骤操作&#xff1a; 确保你已经克隆了Git仓库到本地。 进入仓库所在的目录。 使用pip安装。 以下是具体的命令&#xff1a; 克隆Git仓库到本地&#xff08;替换下面的URL为你的仓库URL&#xff09; git clone https…

【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string

文章目录 知识回顾一、栈&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;1、什么是栈和堆2、为什么要分栈和堆3、栈和堆的区别栈堆 4、总结 二、值类型和引用类型1、那么值类型和引用类型到底有什么区别呢&#xff1f;值类型引用类型 2、总结 三、特殊的引用类…

【C语言实现:用队列模拟栈与用栈模拟队列(LeetCode 225 232)】

LeetCode刷题记录 &#x1f310; 我的博客主页&#xff1a;iiiiiankor&#x1f3af; 如果你觉得我的内容对你有帮助&#xff0c;不妨点个赞&#x1f44d;、留个评论✍&#xff0c;或者收藏⭐&#xff0c;让我们一起进步&#xff01;&#x1f4dd; 专栏系列&#xff1a;LeetCode…

【Python】Selenium 爬虫的使用技巧和案例

引言 Selenium 是 Python 中功能强大的自动化测试工具,因其能够操控浏览器进行模拟操作,被广泛应用于网页数据爬取。相比传统的 requests 等库,Selenium 能更好地应对动态加载内容和复杂交互场景。本文将详细介绍 Selenium 爬虫的使用技巧,并提供实际案例来帮助读者快速上…

MySQL SQL语句性能优化

MySQL SQL语句性能优化指南 一、查询设计优化1. 避免 SELECT *2. 使用 WHERE 进行条件过滤3. 避免在索引列上使用函数和表达式4. 使用 LIMIT 限制返回行数5. 避免使用子查询6. 优化 JOIN 操作7. 避免全表扫描 二、索引优化1. 使用合适的索引2. 覆盖索引3. 索引选择性4. 多列索引…

Mybatis动态sql执行过程

动态SQL的执行原理主要涉及到在运行时根据条件动态地生成SQL语句&#xff0c;然后将其发送给数据库执行。以下是动态SQL执行原理的详细解释&#xff1a; 一、接收参数 动态SQL首先会根据用户的输入或系统的条件接收参数。这些参数可以是查询条件、更新数据等&#xff0c;它们…

java jar包加密 jar-protect

介绍 java 本身是开放性极强的语言,代码也容易被反编译,没有语言层面的一些常规保护机制,jar包很容易被反编译和破解。 受classfinal&#xff08;已停止维护&#xff09;设计启发,针对springboot日常项目开发,重新编写安全可靠的jar包加壳加密技术,用于保护软件版权。 使用说…

Linux:Git

Git常见指令&#xff1a; git help xx_command git xx_command --help git --version 查看git版本git config --global user.name "xxx_name" 全局级别的签名设置&#xff0c;全局的放在本用 git config --global user.ema…

【WiFi】WiFi中RSSI、SNR、NF之间关系及说明

RSSI&#xff08;接收信号强度指示&#xff09; 定义&#xff1a; RSSI 是一个相对值&#xff0c;用于表示接收到的无线信号的强度。它通常由无线设备的硬件&#xff08;如无线网卡或无线芯片&#xff09;直接提供。 计算&#xff1a; RSSI 的计算通常是由设备的无线芯片完成的…

提升音频转录准确性:VAD技术的应用与挑战

引言 在音频转录技术飞速发展的今天&#xff0c;我们面临着一个普遍问题&#xff1a;在嘈杂环境中&#xff0c;转录系统常常将非人声误识别为人声&#xff0c;导致转录结果出现错误。例如&#xff0c;在whisper模式下&#xff0c;系统可能会错误地转录出“谢谢大家”。本文将探…

[ZMQ] -- ZMQ通信Protobuf数据结构 1

1、前言背景 工作需要域间实现zmq通信&#xff0c;刚开始需要比较简单的数据结构&#xff0c;比如两个bool&#xff0c;后面可能就需要传输比较大的数据&#xff0c;所以记录下实现流程&#xff0c;至于为啥选择proto数据结构去做大数据传输&#xff0c;可能是地平线也用这个&…

顺序表的使用,对数据的增删改查

主函数&#xff1a; 3.c #include "3.h"//头文件调用 SqlListptr sql_cerate()//创建顺序表函数 {SqlListptr ptr(SqlListptr)malloc(sizeof(SqlList));//在堆区申请连续的空间if(NULLptr){printf("创建失败\n");return NULL;//如果没有申请成功&#xff…

React和Vue中暴露子组件的属性和方法给父组件用,并且控制子组件暴露的颗粒度的做法

React 在 React 中&#xff0c;forwardRef 是一种高级技术&#xff0c;它允许你将 ref 从父组件传递到子组件&#xff0c;从而直接访问子组件的 DOM 节点或公开的方法。这对于需要操作子组件内部状态或 DOM 的场景非常有用。为了使子组件能够暴露其属性和方法给父组件&#xf…

《C++ 实时视频流物体跟踪与行为分析全解析》

在当今科技飞速发展的时代&#xff0c;视频监控与智能分析技术在众多领域发挥着极为重要的作用。从安防监控到智能交通&#xff0c;从工业自动化到人机交互&#xff0c;利用 C 处理实时视频流中的物体跟踪和行为分析成为了热门且极具挑战性的研究与开发方向。本文将深入探讨其中…

5G中的随机接入过程可以不用收RAR?

有朋友提到了一种不用接收RAR的RA过程&#xff0c;问这个是怎么回事。其实在刚刚写过的LTM cell switch篇章中就有提到&#xff0c;这里把所有相关的内容整理如下。 在RACH-less LTM场景&#xff0c;在进行LTM cell switch之前就要先知道target cell的TA信息&#xff0c;进而才…

git 导出某段时间修改的文件 windows

第一步&#xff1a;列出两次commitID之间的文件变动 git diff oldid newid --name-only// 例如 git diff 4a886c57a8b5611a2abcfcd120461c2e92f7029a HEAD --name-only 4a886c57a8b5611a2abcfcd120461c2e92f7029a 代表之前 HEAD 代表最新或者换成某次commitID 例如&#xf…

Qt 联合Halcon配置

文章目录 配置代码窗口绑定 配置 选择添加库 选择外部库 LIBS -LC:/Program Files/MVTec/HALCON-17.12-Progress/lib/x64-win64/ LIBS -lhalconcpp\-lhdevenginecpp\-lhalconINCLUDEPATH C:/Program Files/MVTec/HALCON-17.12-Progress/include DEPENDPATH C:/Program Fil…

new URL(`../assets/images/${name}`, import.meta.url).href

背景&#xff1a; 文章讲述了Vite框架中关于资源文件&#xff08;如图片&#xff09;在默认配置下&#xff0c;如何正确处理开发环境和打包后的不同引用方式。重点介绍了使用import.meta.url和new URL() 来动态获取并处理静态资源URL的方法&#xff0c;以及注意事项&#xff0…

8、笔记本品牌分类介绍:LG - 计算机硬件品牌系列文章

LG笔记本品牌以其高性能和先进技术而闻名&#xff0c;‌提供多种型号以满足不同用户的需求。‌ LG笔记本产品线包括多种类型&#xff0c;‌以满足不同用户的需求。‌其中&#xff0c;‌LG Gram Pro系列以其超薄设计和高性能配置受到关注。‌该系列笔记本采用16:10的OLED显示屏&…

367_C++_计算mouse移动过程中,视频框的右侧、底部边距,以及根据实时的右侧、底部边距计算—视频框的左上角位置

代码分析 1. restorePos 方法 restorePos 的作用是恢复 NavigationFrame 的位置,将其移动到父窗口或者指定矩形内的特定位置。 void NavigationFrame::restorePos() {// 获取目标矩形:优先使用 `m_pRect`,否则默认使用视频区域或父窗口区域RSRect videoRect(m_pVide