【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
英文地址,請注明出處:http://en.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博客 網絡與信息安…