【QT/C++】实例理解类间的六大关系之实现关系(Realization)

【QT/C++】实例理解类间的六大关系之实现关系(Realization)

在前面章节讲完了实例理解类间的六大关系之泛化关系,效果不错,获得粉丝的一致好评!!!
接下来,本文我将继续尝试分享并总结关于实例理解类间的六大关系之实现关系,同样使用实际案例来进一步理解实现关系,以便应对未来的考试或面试!

提示:在前面章节一文完美概括UML类图及其符号(超详细介绍)中已经对实现关系的概念进行了总结。

(关注不迷路哈!!!)


文章目录


前言 📊

与继承关系不同,实现关系强调的是"能做什么"而非"是什么"。
在面向对象编程中,实现关系(Realization)是描述类与接口之间契约履行的重要关系。本文将深入探讨实现关系的核心概念、代码实现及设计原则。

实现关系UML类图

// 基类(抽象) // 接口定义
class Drawable {
public:virtual void draw() = 0;  // 纯虚函数virtual ~Drawable() = default;
};// 实现类1
class Circle : public Drawable {
public:void draw() override {cout << "Drawing a circle" << endl;}
};// 实现类2
class Rectangle : public Drawable {
public:void draw() override {cout << "Drawing a rectangle" << endl;}
};// ========== 客户端调用方式 ==========
// 方式1:通过基类指针调用
void drawWithPointer(Drawable* shape) {shape->draw();  // 多态调用
}// 方式2:通过基类引用调用
void drawWithReference(Drawable& shape) {shape.draw();    // 多态调用
}// 方式3:通过智能指针管理
void drawWithSmartPointer(unique_ptr<Drawable> shape) {shape->draw();
}

实现关系交互流程图


一、核心概念 🔍

接口定义契约,类实现具体行为(在C++中接口通常由抽象类模拟)

特性说明
本质类履行接口契约("can-do"关系)
设计原则接口定义行为规范,实现类提供具体逻辑
多态基础接口指针/引用可指向实现类对象
UML类图表示实现类 ----▷ 接口(虚线 + 空心三角箭头)
代码关键字C++中使用纯虚类模拟接口

关键要点

  • 接口类所有函数 = 纯虚函数
  • 接口类仅定义行为,不包含数据成员
  • 体现面向接口编程----->依赖倒置原则 (DIP)
  • 接口与实现分离,提高了系统的可扩展性和可维护性

二、接口与抽象类对比 🔒

对比维度接口抽象类
成员类型仅纯虚函数+虚析构函数可包含数据成员和非纯虚函数
设计目的定义纯粹行为契约提供部分实现+强制接口
多重继承安全(无数据成员冲突)需谨慎(可能菱形继承问题)
实例化不能直接实例化不能直接实例化

📝 关键区别接口 强调"能做什么",抽象类 关注"如何共享部分实现"。


三、代码示例与多态实现 ⚙️

1. 代码实现逻辑

代码实现逻辑

2. 完整代码展示

#include <iostream>
using namespace std;// 接口定义(抽象基类)
class Serializable {
public:// 纯虚函数:定义数据序列化的接口规范// const修饰表示不会修改对象状态// =0 表示纯虚函数,必须由派生类实现virtual string serialize() const = 0;// 虚析构函数:确保派生类对象能正确释放资源// default表示使用编译器生成的默认实现// 确保通过基类指针删除派生类对象时能正确调用派生类的析构函数virtual ~Serializable() = default;
};// JSON格式实现类
class JSONData : public Serializable {
public:// override显式声明重写基类虚函数(C++11特性)// 如果签名不匹配,编译器会报错string serialize() const override {return "{ \"data\": \"JSON format\" }";}
};// XML格式实现类
class XMLData : public Serializable {
public:string serialize() const override {return "<data>XML format</data>";}
};// 多态处理器函数
// 参数使用基类引用,可以接受任何派生类对象
// 多态调用:根据实际对象类型调用对应的serialize()实现
void processData(const Serializable& obj) {cout << obj.serialize() << endl;
}int main() {// 创建具体实现类的对象  // 栈上创建对象(自动管理生命周期)JSONData json;  // JSON格式数据对象XMLData xml;    // XML格式数据对象// 也可以用指针:Serializable* p = new JSONData();// 多态处理JSON数据 // 但实际调用的是JSONData::serialize()processData(json);  // 输出: { "data": "JSON format" }// 多态处理XML数据 // 实际调用的是XMLData::serialize()processData(xml);   // 输出: <data>XML format</data>return 0;
}

3. 设计模式解析

这段示例代码体现了:

  1. 策略模式:不同的序列化算法(JSON/XML)可以互相替换
  2. 开闭原则:新增序列化格式(如YAML)无需修改现有代码
  3. 依赖倒置原则(DIP):高层模块processData依赖抽象接口Serializable

策略模式原理说明:
策略模式原理

4. 代码实现框架

代码实现框架

5. 代码交互流程

代码交互流程


四、实现关系的优缺点与最佳实践 💎

维度优点缺点最佳实践
解耦接口与实现分离,降低耦合度接口变更影响所有实现类接口单一职责
扩展性新增实现类不影响现有代码虚函数调用有性能开销优先使用值语义而非继承
测试便于Mock接口进行单元测试接口文档要求高为接口编写完整文档

实现关系应遵循接口隔离原则 (ISP):客户端不应依赖它不需要的接口

💡 QT中的实际应用

// QWidget的子类实现paintEvent接口
class MyWidget : public QWidget {
protected:void paintEvent(QPaintEvent*) override {QPainter painter(this);painter.drawText(rect(), "Hello QT");}
};


五、面试常见问题及回答 🚀

1. 问:接口与抽象类的区别?✅

  • 接口
    1. 仅包含纯虚函数
    2. 定义行为契约
    3. 支持多重实现
  • 抽象类
    1. 可包含实现代码
    2. 定义部分共性实现
    3. 单继承为主

2. 问:如何设计可扩展的插件系统?✅

  • 定义插件接口:可考虑使用 QVector 管理插件
    class PluginInterface { // 定义插件接口
    public:virtual void execute() = 0;virtual ~PluginInterface() = default;
    };class MyPlugin : public PluginInterface {
    public:void execute() override {cout << "Plugin running" << endl;}
    };// 插件管理器
    vector<PluginInterface*> plugins;
    

3. 问:为什么C++没有原生interface关键字?✅

  • 历史原因:C++强调零开销抽象

  • 替代方案:使用纯虚类

    class MyInterface {
    public:virtual void method() = 0;virtual ~MyInterface() = default;
    };
    

4. 问:如何处理接口版本升级?✅

  • 策略1:默认实现(C++11)

    class Upgradable {
    public:virtual void oldMethod() {} // 非纯虚提供默认实现virtual void newMethod() = 0;
    };
    
  • 策略2:接口继承

    class V1Interface { /*...*/ };
    class V2Interface : public V1Interface { /*...*/ };
    

总结 🛠️

  • 实现关系的本质:通过纯虚类定义契约,实现类履行约定
  • 设计原则
    1. 接口应小而专注(ISP原则)
    2. 优先使用组合+接口而非多重继承
    3. 为接口编写完备的文档
  • QT中的应用
    • 事件处理(重写虚函数)
    • 插件系统(接口多态)
    • 绘制系统(QPaintDevice接口)

通过合理使用实现关系,可以构建松耦合、易扩展的系统架构,特别是在框架设计和模块化开发中具有重要价值。

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

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

相关文章

Coze用户账号设置修改用户头像-后端源码

前言 本文将深入分析Coze Studio项目的用户头像修改功能后端实现&#xff0c;通过源码解读来理解整个头像上传和更新流程的架构设计和技术实现。用户头像修改作为用户个人信息管理系统的重要组成部分&#xff0c;主要负责处理图片文件上传、存储和用户信息更新&#xff0c;提升…

【Day 33】Linux-Mysql日志

一、数据库日志的核心作用故障恢复&#xff1a;当数据库因崩溃&#xff08;如断电、进程异常&#xff09;、误操作&#xff08;如删表&#xff09;导致数据丢失时&#xff0c;通过日志恢复数据至一致状态。数据一致性保障&#xff1a;确保事务的 ACID 特性&#xff08;尤其是原…

服务器支持IPv6吗?如何让服务器支持IPv6

服务器是否支持 IPv6 需要视具体的服务商、服务器配置和网络环境而定。以下是关于 服务器支持 IPv6 的相关知识、如何检查支持情况&#xff0c;以及如何配置服务器以支持 IPv6 的详细指南。 1. 什么是 IPv6&#xff1f; IPv6&#xff08;Internet Protocol Version 6&#xff…

37、需求预测与库存优化 (快消品) - /供应链管理组件/fmcg-inventory-optimization

76个工业组件库示例汇总 需求预测与库存优化 (快消品) - 自定义组件 概述 这是一个用于模拟和可视化快消品 (FMCG) 需求预测与库存优化流程的组件。用户可以选择不同的产品和区域&#xff0c;调整预测参数和库存策略&#xff0c;然后运行模拟以查看历史销售、预测需求以及基…

vuex如何在js文件中使用

文章目录前言代码实现1. 导出2. 使用总结前言 vue项目中比较常用的vuex&#xff0c;一般是在.vue文件中使用&#xff0c;那如何在.js文件中使用呢? 代码实现 1. 导出 vuex-store.js&#xff1a; export default {state: {isLogin: false,},mutations: {updateIsLogin(stat…

ESP32开发WSL_VSCODE环境搭建

系列文章目录 ESP32开发WSL_VSCODE环境搭建 文章目录 系列文章目录 前言 一、ESP32 WSL开发环境是啥子? 二、搭建步骤 1.启用WSL功能 2.安装Ubuntu系统 2.1 微软商店下载 2.2 下载发行版 2.3 安装完成后的密码设置 3. 环境配置 3.1 更新 apt工具 3.2 安装ESP-IDF相关应用 3.3…

分布式锁设计实战:多级缓存防御设计优化同步性能

JVM层的双重检查锁(Double-Checked Locking)是一种在多线程环境下优化同步性能的设计模式,主要用于减少锁竞争和提高缓存访问效率。其核心原理如下: ‌工作流程‌ 第一次检查:线程先无锁读取缓存,若命中则直接返回数据 加锁同步:若未命中,线程进入同步代码块 第二次检查…

C#自定义工具类-时间日期工具类

目录 时间日期工具类DateTimeHelper 功能说明 日期格式化 时间戳转换 时间间隔计算 日期边界与调整 时区转换 日期解析 时间相等性判断 时间范围与先后判断 日期合法性与特殊判断 截断时间到指定精度 完整代码 本篇文章分享一下时间日期工具类DateTimeHelper&…

ComfyUI AI一键换装工作流无私分享

1 模型文件准备 clip_l.safetensors &#xff1a;CLIP 文本编码器&#xff0c;将你的提示词转换为文本向量&#xff0c;用于指导图像生成。下载到text_encoderst5xxl_fp16.safetensors&#xff1a;处理复杂文本任务&#xff0c;如提示重写、文本理解、caption 生成。用于处理半…

Windows 下 Qt 获取系统唯一 ID

前言 随着信息化和智能化的发展,软件产品的分发与使用环境日益多样化,软件盗版、非法复制和未经授权的使用问题愈发突出。为了有效保护软件知识产权,同时确保系统和用户数据的安全,软件开发者需要一种可靠的方法来识别每一台设备的唯一性,从而实现“一机一码”的验证机制…

Devops之Jenkins:Jenkins服务器中的slave节点是什么?我们为什么要使用slave节点?如何添加一个windows slave节点?

Jenkins服务器中的slave节点是什么&#xff1f;Jenkins 的slave节点是一台可以在其上执行作业的计算机。从属作业的文件系统、环境变量、操作系统和内存都基于slave节点。您无需在slave节点上安装 Jenkins&#xff0c;它就可以正常工作。我们为什么要使用slave节点&#xff1f;…

大数据世界的开拓者:深入浅出MapReduce分布式计算经典范式

在我们这个数据爆炸的时代,单台计算机的处理能力早已无法应对PB(Petabyte)乃至EB(Exabyte)级别数据的处理需求。想象一下,要在一台普通的电脑上统计全互联网所有网页中出现频率最高的100个词汇,这可能需要耗费数年时间。于是,我们需要一种方法,能将一个巨大的任务拆解…

神经网络|(十一)概率论基础知识-协方差

【1】引言 前序学习进程中&#xff0c;已经对概率论的基础知识做了学习&#xff0c;比如贝特斯公式、朴素贝叶斯算法拉普拉斯平滑计算条件概率等。 在此基础上&#xff0c;我们又对scikit-learn的使用进行了初步探索。 随着学习的深入&#xff0c;对样本数据的处理越来越重要&…

K8s存储与微服务实战精解

K8s存储这样生成的pod名字不固定&#xff0c;IP不固定此时是访问一个无状态的服务&#xff0c;那没什么影响&#xff0c;访问到访问不到都没啥影响但是如果有一个有状态的服务&#xff0c;他要指定master&#xff0c;那此时的pod做不了负载均衡statefulset控制器无头服务创建一…

深度学习-----《PyTorch深度学习核心应用解析:从环境搭建到模型优化的完整实践指南》

一、深度学习框架对比核心框架对比PyTorch&#xff1a;支持GPU加速&#xff0c;底层基于NumPy&#xff0c;Meta&#xff08;原Facebook&#xff09;开发&#xff0c;生态完善&#xff08;如Llama大模型&#xff09;。TensorFlow&#xff1a;谷歌开发&#xff0c;存在2个不兼容版…

Ubuntu Server 系统安装 Docker

文章目录简介Ubuntu Server 简介VirtualBox 安装 Ubuntu Server 系统安装 DockerDocker 配置重启 Docker验证镜像源把用户加入 docker 组开启 Docker Api卸载 Docker简介 本文详细介绍了在Ubuntu系统上安装和配置Docker的完整流程&#xff0c;包括Docker官方源添加、依赖包安装…

从0到1:用 Qwen3-Coder 和 高德MCP 助力数字文旅建造——国庆山西游

从0到1&#xff1a;用 Qwen3-Coder 和 高德MCP 助力数字文旅建造——国庆山西游 1. 背景 “技术不是替代旅行&#xff0c;而是让旅途更有把握&#xff0c;让每一次选择更符合你的期待。” 随着大模型与地图服务能力的成熟&#xff0c;围绕旅游场景的“智能行程助理”成为低门槛…

RabbitMQ--消费端异常处理与 Spring Retry

1. 消息确认机制&#xff08;ack&#xff09;RabbitMQ 消息投递到消费者后&#xff0c;必须确认&#xff08;ack&#xff09;才能从队列中移除&#xff1a;auto-ack true消息一投递就算消费成功。如果消费者宕机&#xff0c;消息会丢失。一般不用。manual-ack false&#xff…

eniac:世界上第一台通用电子计算机的传奇

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; ✨ 1. eniac概述&#xff1a;计算机时代的黎明 eniac&#xff08;ele…

网络与信息安全有哪些岗位:(6)安全开发工程师

想知道网络与信息安全领域有哪些具体岗位吗&#xff1f; 网络与信息安全有哪些岗位&#xff1a;&#xff08;1&#xff09;网络安全工程师-CSDN博客 网络与信息安全有哪些岗位&#xff1a;&#xff08;2&#xff09;渗透测试工程师_网络安全渗透工程师-CSDN博客 网络与信息安…