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

C/C++基础知识复习(44)

1) C++ 中多态性在实际项目中的应用场景

多态性是面向对象编程(OOP)中的一个重要特性,指的是不同的对象可以通过相同的接口来表现不同的行为。在 C++ 中,多态通常通过虚函数(virtual)和继承机制来实现。实际项目中,多态性广泛应用于以下几个场景:

1.1) 图形用户界面(GUI)框架

在图形界面编程中,不同的控件(如按钮、文本框、复选框等)通常是从一个基类(如 WidgetUIElement)继承而来。基类声明一个虚函数(如 draw()),不同的控件通过重写该函数实现不同的绘制方式。这样,程序可以通过统一的接口来操作这些不同类型的控件,而不需要关心它们的具体类型。

class Widget { 
public: virtual void draw() = 0; 
// 纯虚函数 
virtual ~Widget() {
} }; 
class Button : public Widget { 
public: void draw() override { cout << "Drawing Button" << endl; 
} }; 
class TextBox : public Widget { 
public: void draw() override { 
cout << "Drawing TextBox" << endl; 
} }; 
void render(Widget* widget) { widget->draw(); 
// 多态性:不同类型的 Widget 会调用不同的 draw() 
}
1.2) 插件架构(Plugin Architecture)

在需要动态加载插件的系统中,多态性使得可以通过统一的接口与插件进行交互,而不需要在编译时确定插件的具体类型。例如,假设有一个音频处理软件,它可以加载不同的音效插件(如 EchoReverb 等),这些插件继承自一个基类 AudioEffect,并且重写一个通用的 apply() 方法。

class AudioEffect { 
public: virtual void apply() = 0; 
// 纯虚函数 virtual ~AudioEffect() {} }; 
class Echo : public AudioEffect { 
public: void apply() override { cout << "Applying Echo effect" << endl; 
} }; 
class Reverb : public AudioEffect { 
public: void apply() override { 
cout << "Applying Reverb effect" << endl; 
} }; 
void applyEffect(AudioEffect* effect) { 
effect->apply(); 
// 多态性:不同类型的 AudioEffect 会调用不同的 apply() 
}
1.3) 游戏开发中的对象行为管理

在游戏开发中,角色、物品、敌人等对象通常都继承自一个基类(如 GameObject),然后根据不同类型的对象实现不同的行为。通过多态性,游戏逻辑可以以统一的方式处理不同类型的对象。

class GameObject { 
public: virtual void update() = 0; 
virtual ~GameObject() {
} }; 
class Player : public GameObject { 
public: void update() override { cout << "Updating player position" << endl; 
} }; 
class Enemy : public GameObject { 
public: void update() override { 
cout << "Updating enemy position" << endl; 
} }; 
void updateGameObjects(vector<GameObject*>& objects) { 
for (auto obj : objects) { obj->update(); // 多态性:调用正确的 update() 
} }
1.4) 数据库访问层

在一些数据库访问系统中,可以通过多态性来统一访问接口。例如,定义一个数据库基类 Database,然后根据数据库的类型(如 MySQL、PostgreSQL、SQLite)实现具体的数据库访问方式。不同类型的数据库对象通过统一的接口进行操作,而不需要关心具体的实现。

class Database { 
public: 
virtual void connect() = 0; virtual void disconnect() = 0; virtual ~Database() {
} }; 
class MySQL : public Database { 
public: 
void connect() override { cout << "Connecting to MySQL database" << endl; 
} 
void disconnect() override { 
cout << "Disconnecting from MySQL database" << endl; 
} }; 
class SQLite : public Database { 
public: void connect() override { 
cout << "Connecting to SQLite database" << endl; 
} 
void disconnect() override { 
cout << "Disconnecting from SQLite database" << endl; 
} }; 
void performDatabaseOperations(Database* db) { 
db->connect(); // 多态性:不同数据库实现不同连接方式 db->disconnect(); 
// 多态性:不同数据库实现不同断开方式 
}
1.5) 策略模式(Strategy Pattern)

策略模式是一个常见的设计模式,允许在运行时选择算法或操作。在 C++ 中,可以通过多态性来实现不同的策略,并且客户端代码可以动态选择使用哪个策略。

class Strategy { 
public: virtual void execute() = 0; virtual ~Strategy() {} 
}; 
class ConcreteStrategyA : public Strategy { 
public: void execute() override { 
cout << "Executing Strategy A" << endl; 
} }; 
class ConcreteStrategyB : public Strategy { 
public: void execute() override { 
cout << "Executing Strategy B" << endl; 
} }; 
class Context { 
private: Strategy* strategy; 
public: Context(Strategy* strat) : strategy(strat) {} 
void setStrategy(Strategy* strat) { 
strategy = strat; 
} 
void executeStrategy() { 
strategy->execute(); // 多态性:执行不同的策略 
} };

2) C++ 中面向对象编程如何实现数据隐藏?

数据隐藏是面向对象编程(OOP)中的一个重要概念,指的是将对象的内部状态(数据成员)隐藏在类的外部,只通过公共的方法(通常是成员函数)来访问和修改这些数据。这有助于保护数据的完整性和安全性,同时使得外部代码无法直接修改类的内部状态,从而减少了潜在的错误和不必要的复杂性。

C++ 实现数据隐藏的主要机制是通过 访问控制(Access Control)来实现的,使用 privateprotected 等访问修饰符来控制数据的可访问性。

2.1) 使用 private 和 protected 来隐藏数据
  • private:表示该成员只能在类的内部访问,外部无法直接访问或修改。
  • protected:表示该成员可以在类的内部和派生类中访问,但外部无法访问。
  • public:表示该成员可以被外部代码访问。

示例:

class Employee { 
private: int salary; // 隐藏数据,外部无法直接访问 
public: // 构造函数 Employee(int sal) : salary(sal) {} // 公共方法用于访问和修改私有数据 
void setSalary(int sal) { 
if (sal > 0) { // 保护数据的一致性 salary = sal; 
} } 
int getSalary() const { return salary; } }; 
int main() { 
Employee emp(5000); cout << "Salary: " << emp.getSalary() << endl; // 正常访问 emp.setSalary(6000); // 修改数据 cout << "Updated Salary: " << emp.getSalary() << endl; return 0; }
2.2) 友元函数(Friend Function)

虽然 C++ 提供了访问控制机制,但有时候需要允许特定的函数访问类的私有成员。此时可以通过 友元函数 来实现。友元函数并不属于类的一部分,但它可以访问类的私有和保护成员。

class Box { 
private: int length; 
public: Box(int len) : length(len) {} 
// 声明友元函数 
friend void printLength(const Box& b); }; 
// 友元函数可以访问私有数据 
void printLength(const Box& b) { cout << "Length: " << b.length << endl; } 
int main() { 
Box box(10); printLength(box); // 友元函数可以访问私有成员 
return 0; }
2.3) 封装与接口

通过封装技术,可以将类的数据和操作数据的函数捆绑在一起,外部只能通过公共的接口(即类的公共方法)来与类的内部数据交互,从而实现数据隐藏。

通过这样的设计,类的实现细节可以随时改变而不影响外部使用它的代码。比如,你可以在内部实现中更换数据结构,而外部代码并不需要知道这些细节,只需要依赖于类提供的接口。

总结来说,C++ 中通过访问控制修饰符(如 privateprotectedpublic)和封装技术来实现数据隐藏,并通过提供公共方法来访问和修改隐藏的数据。数据隐藏的好处在于保护类的内部状态不被外部直接修改,从而保证数据的安全性和一致性。

相关文章:

C/C++基础知识复习(44)

1) C 中多态性在实际项目中的应用场景 多态性是面向对象编程&#xff08;OOP&#xff09;中的一个重要特性&#xff0c;指的是不同的对象可以通过相同的接口来表现不同的行为。在 C 中&#xff0c;多态通常通过虚函数&#xff08;virtual&#xff09;和继承机制来实现。实际项…...

【day13】深入面向对象编程

【day12】回顾 在正文开始之前&#xff0c;先让我们回顾一下【day12】中的关键内容&#xff1a; 接口&#xff08;Interface&#xff09;&#xff1a; interface关键字用于定义接口。implements关键字用于实现接口。 接口成员&#xff1a; 抽象方法&#xff1a;需要在实现类中…...

《 火星人 》

题目描述 人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言&#xff0c;但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的&#xff0c;首先&#xff0c;火星人把一个非常大的数字告诉人类科学家&#xff0c;科学家破解这…...

盒子模型(内边距的设置)

所有元素都可以设置内边距属性和外边距属性大体相同&#xff0c;可参考上一篇&#xff0c;但有区别 内边距不能设置为负值padding-方向&#xff1a;尺寸 注意&#xff1a;使用内边距padding之后元素整体会变大&#xff0c;因为他是直接加上了内边距的大小&#xff0c;不改变元素…...

CentOS7网络配置,解决不能联网、ping不通外网、主机的问题

1. 重置 关闭Centos系统 编辑->虚拟网络编辑器 还原默认设置 2. 记录基本信息 查看网关地址,并记录在小本本上 查看网段,记录下 3. 修改网卡配置 启动Centos系统 非root用户,切换root su root查看Mac地址 ifconfig 或 ip addr记录下来 修改配置文件 vim /et…...

如何测继电器是否正常

继电器是一种电控制器件&#xff0c;广泛应用于自动控制、电力保护等领域。为了确保继电器的正常工作&#xff0c;定期检测其状态是非常必要的。以下是一些常用的方法来测试继电器是否正常工作&#xff1a; 1. 视觉检查&#xff1a; - 观察继电器的外观是否有损坏、变形或烧焦…...

最优二叉搜索树【东北大学oj数据结构10-4】C++

题面 最优二叉搜索树是由 n 个键和 n1 个虚拟键构造的二叉搜索树&#xff0c;以最小化搜索操作的成本期望值。 给定一个序列 Kk1​,k2​,...,kn​&#xff0c;其中 n 个不同的键按排序顺序 &#xff0c;我们希望构造一个二叉搜索树。 对于每个关键 ki​&#xff0c;我们有一个…...

ESP32应用开发-Webserver

文章目录 库调用实例实现思路技术要点 1. 前端涉及的文件需要包装再发送2. http-GET路由3. http-POST路由 开发环境&#xff1a;Arduino 库调用 #include <WebServer.h> #include <ArduinoJson.h> //IDE没有自带&#xff0c;需自行安装实例 WebServer server…...

【IMU:视觉惯性SLAM系统】

视觉惯性SLAM系统简介 相机&#xff08;单目/双目/RGBD)与IMU结合起来就是视觉惯性&#xff0c;通常以单目/双目IMU为主。 IMU里面有个小芯片可以测量角速度与加速度&#xff0c;可分为6轴(6个自由度)和9轴&#xff08;9个自由度&#xff09;IMU&#xff0c;具体的关于IMU的介…...

前端开发 之 12个鼠标交互特效下【附完整源码】

前端开发 之 12个鼠标交互特效下【附完整源码】 文章目录 前端开发 之 12个鼠标交互特效下【附完整源码】七&#xff1a;粒子烟花绽放特效1.效果展示2.HTML完整代码 八&#xff1a;彩球释放特效1.效果展示2.HTML完整代码 九&#xff1a;雨滴掉落特效1.效果展示2.HTML完整代码 十…...

Unity文件路径访问总结:从基础到高级的资源加载方法

在Unity开发中&#xff0c;文件路径的访问和资源加载是开发者经常需要处理的任务。无论是加载纹理、模型、音频&#xff0c;还是读取配置文件&#xff0c;正确地处理路径和资源加载是确保项目顺利运行的关键。本文将以Unity文件路径访问为主线&#xff0c;详细介绍Unity中常见的…...

AWS Transfer 系列:简化文件传输与管理的云服务

在数字化转型的今天&#xff0c;企业对文件传输、存储和管理的需求日益增长。尤其是对于需要大量数据交换的行业&#xff0c;如何高效、可靠地传输数据成为了一大挑战。为了解决这一难题&#xff0c;AWS 提供了一系列的文件传输服务&#xff0c;统称为 AWS Transfer 系列。这些…...

Jenkins Api Token 访问问题

curl --location http://192.168.18.202:8080/view/ChinaFish/job/Ali/buildWithParameters?token1142be281174ee8fdf58773dedcef7ea4c&DeployTypeUpdateConfig \ --header Authorization: •••••• \ --header Cookie: JSESSIONID.824aa9a5node01ojk9yhh3imc24duwy67…...

垂起固定翼无人机大面积森林草原巡检技术详解

垂起固定翼无人机大面积森林草原巡检技术是一种高效、精准的监测手段&#xff0c;以下是对该技术的详细解析&#xff1a; 一、垂起固定翼无人机技术特点 垂起固定翼无人机结合了多旋翼和固定翼无人机的优点&#xff0c;具备垂直起降、飞行距离长、速度快、高度高等特点。这种无…...

【Leetcode 每日一题】1387. 将整数按权重排序

问题背景 我们将整数 x x x 的 权重 定义为按照下述规则将 x x x 变成 1 1 1 所需要的步数&#xff1a; 如果 x x x 是偶数&#xff0c;那么 x x / 2 x x / 2 xx/2。如果 x x x 是奇数&#xff0c;那么 x 3 x 1 x 3 \times x 1 x3x1。 比方说&#xff0c; x …...

科研笔记 KDD 2025

1 基本介绍 KDD 每年有多次投稿周期。KDD 2025 将有两个截止时间&#xff1a;分别是 2024 年 8 月 1 日和 2025 年 2 月 1 日&#xff08;全文提交截止时间在摘要提交截止后一周&#xff09;。 同时&#xff0c;KDD 会议论文集&#xff08;Proceedings&#xff09;将分两批出…...

黑马Java面试教程_P8_并发编程

系列博客目录 文章目录 系列博客目录前言1.线程的基础知识1.1 线程和进程的区别&#xff1f;难2频3面试文稿 1.2 并行和并发有什么区别&#xff1f; 难1频1面试文稿 1.3 创建线程的四种方式 难2频4面试文稿 1.4 runnable 和 callable 有什么区别 难2频3面试文稿 1.5 线程的 run…...

网络视频监控平台/安防监控/视频综合管理Liveweb视频汇聚平台解决方案

一、当前现状分析 当前视频资源面临以下问题&#xff1a; 1&#xff09;不同单位在视频平台建设中以所属领域为单位&#xff0c;设备品牌众多&#xff0c;存在的标准不一&#xff0c;各系统之间也没有统一标准&#xff1b; 2&#xff09;各单位视频平台建设分散、统筹性差&am…...

workman服务端开发模式-应用开发-后端api推送修改二

需要修改两个地方&#xff0c;第一个是总控制里面的续token延时&#xff0c;第二个是操作日志记录 一、总控续token延时方法 在根目录下app文件夹下controller文件夹下Base.php中修改isLoginAuth方法&#xff0c;具体代码如下&#xff1a; <?php /*** 总控制* User: 龙哥…...

SQL 使用带聚集函数的联结

聚集函数用于汇总数据&#xff0c;通常用于从一个表中计算统计信息&#xff0c;但也可以与联结一起使用。以下是一个例子&#xff0c;展示如何使用聚集函数统计每个顾客的订单数。 示例 1&#xff1a;使用 COUNT() 函数与 INNER JOIN 假设我们需要检索所有顾客及每个顾客所下…...

OpenClaw本地模型成本对比:nanobot镜像vs商业API实测

OpenClaw本地模型成本对比&#xff1a;nanobot镜像vs商业API实测 1. 为什么需要关注OpenClaw的模型成本 上周我在尝试用OpenClaw自动化处理200份PDF文档时&#xff0c;意外发现账单上出现了三位数的API费用。这个数字让我意识到——当OpenClaw需要频繁调用大模型进行决策时&a…...

Obsidian-i18n:破解插件语言壁垒的无缝本地化方案——让中文用户零门槛掌控千款插件

Obsidian-i18n&#xff1a;破解插件语言壁垒的无缝本地化方案——让中文用户零门槛掌控千款插件 【免费下载链接】obsidian-i18n 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-i18n 问题诊断&#xff1a;插件语言障碍如何制约Obsidian用户体验&#xff1f; …...

leOS2:基于看门狗定时器的轻量级嵌入式调度器

1. leOS2&#xff1a;基于看门狗定时器的轻量级嵌入式调度器 leOS2&#xff08;little embedded Operating System 2&#xff09;是一个专为资源受限的8位AVR微控制器设计的极简实时调度器。它不依赖于通用定时器&#xff08;如Timer0/Timer1&#xff09;&#xff0c;而是创造…...

Antares LoRaWAN库深度解析:嵌入式LoRaWAN MAC层实现指南

1. Antares LoRaWAN 库深度技术解析&#xff1a;面向嵌入式工程师的 LoRaWAN MAC 层实现指南 1.1 库定位与工程价值 Antares LoRaWAN 是一个专为 Arduino 生态设计的轻量级 LoRaWAN MAC 层实现库&#xff0c;其核心价值不在于功能堆砌&#xff0c;而在于 可理解性、可调试性与…...

开源项目国际化:多语言配置全流程指南

开源项目国际化&#xff1a;多语言配置全流程指南 【免费下载链接】pivottable Open-source Javascript Pivot Table (aka Pivot Grid, Pivot Chart, Cross-Tab) implementation with dragndrop. 项目地址: https://gitcode.com/gh_mirrors/pi/pivottable 跨国团队如何让…...

PCB布局设计规范与最佳实践指南

PCB布局设计的最佳实践指南1. 布局设计基础原则1.1 结构约束优先处理在PCB布局初期&#xff0c;必须优先考虑机械结构约束条件&#xff1a;根据导入的结构文件定位所有有特殊位置要求的器件连接器1脚位置必须与结构设计完全匹配严格遵守产品设计中规定的元件限高要求1.2 美观与…...

实战指南:在Kali Linux上构建HexStrike AI与Trae MCP的智能安全联动平台

1. 环境准备与基础配置 在Kali Linux上构建HexStrike AI与Trae MCP的智能安全联动平台&#xff0c;首先需要确保基础环境配置正确。我建议使用物理机直接安装Kali Linux&#xff0c;相比虚拟机方案能获得更好的性能表现&#xff0c;特别是在处理大规模安全扫描任务时。如果确实…...

AI写教材必备!高效工具生成低查重教材,节省大量时间

AI教材生成工具评测与介绍 在编写教材前&#xff0c;选择合适的工具简直是一场“挣扎”的过程&#xff01;如果用普通的办公软件&#xff0c;功能就显得太简单&#xff0c;框架和格式都需要自己一一调整&#xff1b;若选用专门的AI教材写作工具&#xff0c;操作却显得复杂&…...

用ProcessOn复刻《纳瓦尔宝典》思维导图:我是如何把一本投资哲学书变成可执行行动清单的

用ProcessOn将《纳瓦尔宝典》转化为可执行行动指南&#xff1a;从思维导图到每日实践的完整方法论 当合上这本被硅谷创投圈奉为"现代智慧集"的书籍时&#xff0c;很多人会陷入相似的困境——那些关于财富杠杆、幸福习惯的洞见在脑海中闪烁&#xff0c;却不知如何嵌入…...

从AlexNet到MobileNet:深度可分离卷积如何用1/4参数量实现高效推理?

从AlexNet到MobileNet&#xff1a;深度可分离卷积如何用1/4参数量实现高效推理&#xff1f; 在移动互联网时代&#xff0c;AI模型部署正经历从云端到边缘的范式转移。当我们谈论"高效推理"时&#xff0c;实际上是在探讨一个核心矛盾&#xff1a;如何在有限的硬件资源…...