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

C++继承与组合设计

C继承与组合设计继承和组合是面向对象设计中两种重要的代码复用机制。继承表示是一个关系而组合表示有一个关系。理解何时使用继承、何时使用组合是设计良好系统的关键。继承允许派生类继承基类的属性和方法实现代码复用和多态。#include#include#include#includeclass Vehicle {protected:std::string brand_;int year_;public:Vehicle(const std::string brand, int year): brand_(brand), year_(year) {}virtual ~Vehicle() default;virtual void start() const {std::cout brand_ vehicle starting\n;}virtual void stop() const {std::cout brand_ vehicle stopping\n;}std::string brand() const { return brand_; }int year() const { return year_; }};class Car : public Vehicle {int doors_;public:Car(const std::string brand, int year, int doors): Vehicle(brand, year), doors_(doors) {}void start() const override {std::cout brand_ car with doors_ doors starting\n;}int doors() const { return doors_; }};class Motorcycle : public Vehicle {bool has_sidecar_;public:Motorcycle(const std::string brand, int year, bool sidecar): Vehicle(brand, year), has_sidecar_(sidecar) {}void start() const override {std::cout brand_ motorcycle starting;if (has_sidecar_) std::cout (with sidecar);std::cout \n;}};void inheritance_example() {std::vector vehicles;vehicles.push_back(std::make_unique(Toyota, 2020, 4));vehicles.push_back(std::make_unique(Harley, 2019, false));for (const auto v : vehicles) {v-start();}}组合通过包含其他对象来实现功能复用提供了更大的灵活性。class Engine {int horsepower_;public:explicit Engine(int hp) : horsepower_(hp) {}void start() const {std::cout Engine ( horsepower_ hp) starting\n;}void stop() const {std::cout Engine stopping\n;}int horsepower() const { return horsepower_; }};class Transmission {std::string type_;public:explicit Transmission(const std::string type) : type_(type) {}void shift_gear(int gear) const {std::cout type_ transmission shifting to gear gear \n;}};class ComposedCar {std::string brand_;Engine engine_;Transmission transmission_;public:ComposedCar(const std::string brand, int hp, const std::string trans_type): brand_(brand), engine_(hp), transmission_(trans_type) {}void start() const {std::cout brand_ car starting\n;engine_.start();}void drive() const {transmission_.shift_gear(1);transmission_.shift_gear(2);}void stop() const {engine_.stop();}};void composition_example() {ComposedCar car(Honda, 200, Automatic);car.start();car.drive();car.stop();}多重继承允许一个类继承多个基类但需要小心处理菱形继承问题。class Printable {public:virtual ~Printable() default;virtual void print() const 0;};class Serializable {public:virtual ~Serializable() default;virtual std::string serialize() const 0;};class Document : public Printable, public Serializable {std::string content_;public:explicit Document(const std::string content) : content_(content) {}void print() const override {std::cout Printing: content_ \n;}std::string serialize() const override {return DOC: content_;}};void multiple_inheritance_example() {Document doc(Important document);doc.print();std::cout Serialized: doc.serialize() \n;}接口继承定义纯虚函数强制派生类实现特定接口。class ILogger {public:virtual ~ILogger() default;virtual void log(const std::string message) 0;};class ConsoleLogger : public ILogger {public:void log(const std::string message) override {std::cout [Console] message \n;}};class FileLogger : public ILogger {std::string filename_;public:explicit FileLogger(const std::string filename) : filename_(filename) {}void log(const std::string message) override {std::cout [File: filename_ ] message \n;}};class Application {ILogger* logger_;public:explicit Application(ILogger* logger) : logger_(logger) {}void run() {logger_-log(Application started);logger_-log(Processing data);logger_-log(Application finished);}};void interface_inheritance_example() {ConsoleLogger console;FileLogger file(app.log);Application app1(console);app1.run();Application app2(file);app2.run();}组合优于继承是一个重要的设计原则提供了更好的灵活性和可测试性。class Renderer {public:virtual ~Renderer() default;virtual void render(const std::string content) const 0;};class HTMLRenderer : public Renderer {public:void render(const std::string content) const override {std::cout content \n;}};class MarkdownRenderer : public Renderer {public:void render(const std::string content) const override {std::cout # content \n;}};class Page {std::string title_;std::string content_;std::unique_ptr renderer_;public:Page(const std::string title, const std::string content,std::unique_ptr renderer): title_(title), content_(content), renderer_(std::move(renderer)) {}void display() const {std::cout Title: title_ \n;renderer_-render(content_);}void set_renderer(std::unique_ptr renderer) {renderer_ std::move(renderer);}};void composition_over_inheritance() {Page page(Welcome, Hello World, std::make_unique());page.display();page.set_renderer(std::make_unique());page.display();}私有继承实现用...实现的关系不是是一个关系。class Timer {protected:int seconds_;public:explicit Timer(int seconds) : seconds_(seconds) {}void tick() {if (seconds_ 0) {--seconds_;std::cout Time remaining: seconds_ s\n;}}bool expired() const {return seconds_ 0;}};class Alarm : private Timer {public:explicit Alarm(int seconds) : Timer(seconds) {}void check() {tick();if (expired()) {std::cout ALARM! Times up!\n;}}};void private_inheritance_example() {Alarm alarm(3);alarm.check();alarm.check();alarm.check();alarm.check();}继承和组合的选择取决于具体场景理解两者的优缺点是做出正确设计决策的关键。

相关文章:

C++继承与组合设计

C继承与组合设计继承和组合是面向对象设计中两种重要的代码复用机制。继承表示"是一个"关系,而组合表示"有一个"关系。理解何时使用继承、何时使用组合是设计良好系统的关键。继承允许派生类继承基类的属性和方法,实现代码复用和多态…...

思源黑体TTF构建指南:免费商用多语言字体的终极解决方案

思源黑体TTF构建指南:免费商用多语言字体的终极解决方案 【免费下载链接】source-han-sans-ttf A (hinted!) version of Source Han Sans 项目地址: https://gitcode.com/gh_mirrors/so/source-han-sans-ttf 你是否曾为多语言项目中的字体问题而烦恼&#xf…...

ElevenLabs江苏话语音模型训练全链路拆解:从200小时带标注吴语语料清洗,到MOS得分达4.13的关键超参组合

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs江苏话语音模型训练全链路拆解:从200小时带标注吴语语料清洗,到MOS得分达4.13的关键超参组合 语料清洗与方言对齐策略 针对原始200小时江苏话(含苏州、无…...

实测taotoken在不同时段api调用的响应延迟与稳定性表现

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 实测taotoken在不同时段api调用的响应延迟与稳定性表现 对于依赖大模型API进行开发的团队而言,服务的响应延迟与稳定性…...

taotoken如何为github actions工作流提供稳定的大模型服务

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 taotoken如何为github actions工作流提供稳定的大模型服务 应用场景类,探讨在github actions自动化流水线中集成taotok…...

实测 Taotoken 多模型聚合调用的响应延迟与稳定性体感

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 实测 Taotoken 多模型聚合调用的响应延迟与稳定性体感 在将大模型能力集成到实际应用的过程中,开发者除了关注功能实现…...

AutoGen 框架深度使用指南

AutoGen 框架深度使用指南:从零搭建多智能体协作系统 1. 引入与连接:你为什么需要AutoGen? 1.1 开场:每个开发者都遇到过的痛点 你有没有过这样的经历:用ChatGPT写了一段Python数据分析代码,复制到本地运行报错,再把报错信息粘贴回去让它改,来回折腾5、6次才跑通;要…...

腾讯 Marvis 马维斯完整使用教程 2026 最新版

从下载安装到文件整理 电脑控制 跨端协同 隐私模式和向量引擎扩展 一篇讲清楚一 先说结论 Marvis不是普通聊天工具 如果你最近关注 AI 助手,大概率已经刷到过腾讯 Marvis,也就是中文名马维斯。 它在 2026 年 5 月正式开放下载后,最大的看点…...

NLP之BERT预训练模型详解

摘要: BERT(Bidirectional Encoder Representations from Transformers)是谷歌于2018年提出的革命性自然语言处理模型,首次将基于Transformer的双向编码器架构成功应用于预训练语言模型,在多项NLP基准任务上刷新了最优…...

C#从零开始学习笔记---第九天

又是新的一天,欢迎大家继续查看我的学习笔记,这两天确实状态一般,今天内容我们也不记录太多,主要分为两大块,第一块是对之前提到过的数组进行一个复习,第二块就是在记录一下集合和哈希表的一些内容。话不多…...

在 LangGraph 里做动态路由:意图分类+置信度阈值+回退链路

LangGraph 生产级动态路由实战:意图分类+置信度校准+多级回退链路全栈实现 关键词 LangGraph, 大语言模型Agent, 动态路由, 意图分类, 置信度阈值校准, 多级回退机制, 可控Agent架构 摘要 当前大模型Agent开发已从玩具级Demo走向生产级落地,静态路由的固定执行逻辑无法适…...

SQL 语句:从产生、发展到内容全景

引言:数据世界的通用语言 SQL(Structured Query Language,结构化查询语言)是当今数据领域最核心、最通用的语言。无论是数据分析师、后端工程师还是数据科学家,都离不开 SQL。它就像数据世界的“普通话”,连…...

大中小型企业数据配置年度成本估算分析

引言 在数字化转型浪潮下,数据已成为企业的核心资产。无论是初创公司、中型企业还是大型集团,合理规划数据存储、处理与分析的成本,对于优化IT预算、提升投资回报率至关重要。本文旨在为不同规模的企业提供一个清晰、可操作的年度数据配置成本…...

大中小型企业数据层配置规模分析与选型指南

引言 在数字化转型浪潮中,数据已成为企业的核心资产。无论是初创公司、中型企业还是大型集团,构建一个稳定、高效、可扩展的数据层架构都是支撑业务发展的基石。然而,不同规模的企业在数据量、业务复杂度、团队能力和预算投入上存在显著差异&…...

SQL 最常用技能详解与实战示例

引言 SQL(Structured Query Language,结构化查询语言)是与关系型数据库交互的核心工具。无论是数据分析师、后端开发工程师还是产品经理,掌握 SQL 的核心技能都至关重要。本文将系统性地介绍 SQL 中最常用、最核心的技能&#xff…...

AI辅助编程:发展现状、效率评估与未来展望

引言:AI如何重塑编程范式? 在过去的几年里,人工智能(AI)正以前所未有的速度渗透到软件开发的各个角落。从最初的代码补全工具,到如今能够理解复杂需求、生成完整函数甚至设计系统架构的智能体,AI辅助编程已经从科幻概念演变为开发者日常工作中不可或缺的“副驾驶”。它…...

Dism++:你的Windows系统优化瑞士军刀,16国语言支持的免费神器

Dism:你的Windows系统优化瑞士军刀,16国语言支持的免费神器 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language 你是否曾为Windows系统越来越…...

Windows热键冲突终极指南:如何用Hotkey Detective一键精准定位占用程序

Windows热键冲突终极指南:如何用Hotkey Detective一键精准定位占用程序 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detecti…...

WarcraftHelper:5分钟解决魔兽争霸III现代兼容性问题的终极指南

WarcraftHelper:5分钟解决魔兽争霸III现代兼容性问题的终极指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典魔兽争霸III在W…...

视频硬字幕提取神器:3分钟将任何视频字幕转为可编辑SRT文件

视频硬字幕提取神器:3分钟将任何视频字幕转为可编辑SRT文件 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、字…...

KMS_VL_ALL_AIO终极指南:三步永久激活Windows和Office系统

KMS_VL_ALL_AIO终极指南:三步永久激活Windows和Office系统 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗?Office文档突然变…...

森林-服务器存档

对于想要自建游戏服务器的玩家,云鸢互联是一个不错的专业联机平台选择。它提供稳定、低延迟且724小时在线的服务器环境,助你轻松打造专属游戏世界。平台主打极致的新手友好——全图形化控制面板,无需编写代码,也无需掌握Linux命令…...

森林The Forest - 服务器开服

对于想要自建游戏服务器的玩家,云鸢互联是一个不错的专业联机平台选择。它提供稳定、低延迟且724小时在线的服务器环境,助你轻松打造专属游戏世界。平台主打极致的新手友好——全图形化控制面板,无需编写代码,也无需掌握Linux命令…...

Agent 时代的开发者技能树重构指南

1. 标题选项 核心关键词:AI Agent、开发者转型、技能树重构、职业跃迁 《Agent 时代降临:普通开发者的技能树重构全指南,从CRUD Boy到AI应用工程师的跃迁之路》 《别再只会写CRUD了!AI Agent浪潮下,你必须掌握的新技能树体系》 《从软件开发到AI Agent开发:2024年开发者技…...

Linux】2026 年 13 款最强视频播放器(含安装命令 + 优缺点)

Linux视频播放器选择多样,如榛名、MPlayer、VLC等,功能强大、支持多格式,满足各类用户需求 一、榛名视频播放器 榛名视频播放器是一款基于Qt的开源视频播放器,提供了许多基本功能。其特点包括支持Youtube-dl、控制播放速度、丰富…...

浙大联合腾讯让AI“看懂“三维世界

这项由浙江大学、腾讯混元大模型团队、香港科技大学及深圳湾区研究院联合完成的研究,以预印本形式发布于2026年5月,论文编号为arXiv:2605.15876,有兴趣深入了解的读者可通过该编号查询完整论文。当你拿起手机拍下一张客厅照片,现在…...

从零开发游戏需要学习的c#模块,第二十章(2D 敌人与战斗触发)

本节课我们要学习的内容在地图上随机生成红色敌人玩家碰到敌人后,进入战斗模式战斗胜利后敌人消失,获得分数屏幕显示敌人数量using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Syst…...

AI 时代的平台工程

两个月前,正是我 Aha moment 不断,多巴胺爆炸的时刻,每天都会记录下很多灵感和想法,准备在未来写成文章,或者开发成工具。其中有一条是这样的:AI 时代的平台工程(CLISkillMCP,可访问…...

加印了!谢谢大家,这本不讲空话的“AI落地说明书”为什么能卖爆?

想不到有一天我也会有“书竟然卖爆了”的感觉,机械工业出版社要紧急加印才能供上货的那种。特别感谢机械工业出版社的朋友们从策划到发布的全程细致高效的工作,感谢微软中国首席技术官韦青老师亲临发布会现场为我们共同的理想发声,更要感谢各…...

MongoDB 连接详解

MongoDB 连接详解 引言 MongoDB 是一款强大的 NoSQL 数据库,以其灵活的文档存储和强大的扩展性而备受青睐。在开发过程中,与 MongoDB 的连接是至关重要的第一步。本文将详细讲解 MongoDB 的连接方式、连接参数以及连接池的使用,帮助您更好地理解并使用 MongoDB。 MongoDB…...