C++設計模式:類間關系

類封裝了數據和行為,是面向對象的重要組成部分,它是具有相同屬性、操作、關系的對象集合的總稱。在系統中,每個類都具有一定的職責,職責指的是類要完成什么樣子的功能,要承擔什么樣子的義務。一個類可以有多種職責,但是設計得好的類一般只有一種職責。

類與類之間的關系

繼承關系

繼承也叫作泛化(Generalization),子類(派生類)繼承父類(基類)的屬性和方法,并可擴展或重寫父類功能。

C++ 中沒有專門的 “接口” 關鍵字,通常用純虛基類模擬接口,子類通過?public?繼承該純虛類并實現其所有純虛函數。

class Bird
{
public:string getName(){return m_name;}void setName(string name){m_name = name;}virtual void fly() {}virtual void eat() {}
protected:string m_sex;string m_name;
};class Cuckoo : public Bird
{
public:void fly() override{cout << "我拍打翅膀飛行..." << endl;}void eat() override{cout << "我喜歡吃肉肉的小蟲子..." << endl;}
};class Eagle : public Bird
{
public:void fly() override{cout << "我展翅翱翔..." << endl;}void eat() override{cout << "我喜歡吃小動物..." << endl;}
};

?組合關系

組合(Composition)表示 “整體 - 部分” 關系,部分完全依賴整體存在(強包含)。

部分不能脫離整體獨立存在,整體的生命周期決定部分的生命周期(整體創建時部分被創建,整體銷毀時部分也被銷毀),部分只能屬于一個整體。
例如人和心臟:心臟是人的一部分,人死亡后心臟也不再獨立存在。

class Heart {
public:void beat() {}
};
class Person {
private:Heart heart; // 組合關系(部分作為成員變量,隨整體創建/銷毀)
public:Person() : heart() {} // 構造時創建心臟
};

?聚合關系

聚合(Aggregation)表示 “整體 - 部分” 關系,部分可脫離整體獨立存在(弱包含)。

整體通過成員變量持有部分的指針 / 引用,整體包含部分,但部分的生命周期不由整體控制,部分可屬于多個整體。

比如公司和員工:員工是公司的一部分,但員工可離職(脫離公司存在)。

class Employee {};
class Company {
private:std::vector<Employee*> employees; // 聚合員工(部分)
public:void addEmployee(Employee* e) {employees.push_back(e);}
};

關聯關系

表示兩個類之間存在長期、穩定的連接,通常體現為一個類持有另一個類的對象引用(或指針)。

關系可單向或雙向(如 A 關聯 B,或 A 與 B 相互關聯),類之間生命周期相互獨立,關聯不影響對象的創建與銷毀。

單向關聯

單向關聯指的是關聯只有一個方向,比如每個孩子都擁有一個Parent,其代碼實現為:

class Parent
{
};class Child
{
private:Parent m_father;
};
雙向關聯

現實生活中每個孩子都有父母,每個父母同樣有自己的孩子,如果想要通過類來描述這樣的親情關系,代碼如下:

class Parent
{
private:Child* m_son;
};class Child
{
private:Parent* m_father;
};
自關聯

自關聯指的就是當前類中包含一個自身類型的對象成員,這在鏈表中非常常見,單向鏈表中都會有一個指向自身節點類型的后繼指針成員,而雙向鏈表中會包含一個指向自身節點類型的前驅指針和一個指向自身節點類型的后繼指針。就以雙向鏈表節點類為例,它的C++寫法為:

class Node 
{
private:void* m_data;Node* m_prev;Node* m_next;
};

?依賴關系

表示一個類(依賴方)在執行特定操作時,臨時需要另一個類(被依賴方)的協助,是一種短期的 “使用” 關系。

通常通過方法參數、局部變量或靜態方法調用體現,無長期持有關系,操作結束后依賴消失。

例如計算器計算時需要臨時使用數字Number對象:

class Number {
public:int value;
};
class Calculator {
public:// 通過參數依賴 Numberint add(Number a, Number b) { return a.value + b.value; }
};

總結

類之間的關系強弱順序是這樣的:繼承(含接口實現)?>??組合??>??聚合??>??關聯??>??依賴。

在實際設計中,應優先使用低耦合關系(如關聯、聚合、組合),避免過度依賴繼承,以提高代碼的靈活性和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93220.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93220.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93220.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MSYS2+CMake配置C/C++開發環境

目錄一、MSYS2是什么1.1 核心架構與組件??1.1.1 背景介紹1.1.1.1 Cygwin1.1.1.2 MinGW和Mingw-w641.1.1.3MSYS和MSYS21.1.2 技術基礎??1.1.3 多環境支持??1.2 核心功能??1.2.1 類Unix開發環境??1.2.2 開發工具鏈??1.2.3 軟件倉庫與包管理??二、安裝和配置2.1 配置…

Vue 3 + TypeScript:package.json 示例 / 詳細注釋說明

一、示例 / 詳細注釋說明 {// 項目基礎信息"name": "vite-project", // 項目名稱&#xff08;建議使用 kebab-case 格式&#xff09;"private": true, // 標記為私有項目&#xff0c;避免意外發布到 npm"version": "1.0.…

SpatialVLM和SpatialRGPT論文解讀

目錄 一、SpatialVLM 1、概述 2、方法 3、實驗 二、SpatialRGPT 1、概述 2、方法 3、訓練方法 4、實驗 一、SpatialVLM 1、概述 SpatialVLM是最早的依賴傳統VLMs實現3D空間推理能力的論文&#xff0c;在24年1月由DeepMind團隊提出&#xff0c;當時對比的還是GPT4v&am…

理解GPU架構:基礎與關鍵概念

GPU 基礎概述&#xff1a;從圖形渲染到 AI 與高性能計算的核心 Graphics Processing Units&#xff08;GPU&#xff09;已從專用的圖形渲染硬件演進為 AI、科學計算與高性能任務的中堅力量。本文將介紹 GPU 架構的基礎知識&#xff0c;包括其組成部分、內存層次結構&#xff0c…

訂單狀態定時處理(Spring Task 定時任務)

訂單狀態定時處理 如果最后一秒剛好支付了咋辦?如何補償? 需要將支付狀態和訂單狀態一起考慮,或者直接使用狀態機 Spring Task 是Spring框架提供的任務調度工具,可以按照約定的時間自動執行某個代碼邏輯。 **定位:**定時任務框架 **作用:**定時自動執行某段Java代碼 …

職得AI簡歷-免費AI簡歷生成工具

本文轉載自&#xff1a;職得AI簡歷-免費AI簡歷生成工具 - Hello123工具導航 ** 一、核心功能解析 職得 AI 簡歷是 AI 驅動的智能求職平臺&#xff0c;通過深度學習算法分析百萬優質簡歷數據&#xff0c;提供從簡歷生成到面試準備的全流程服務&#xff0c;顯著提升求職競爭力。…

8.14 機器學習(1)

機器學習基礎一、什么是機器學習定義&#xff1a;讓計算機利用大量數據在特定任務上持續改進性能的過程&#xff0c;可以讓任務完成的更好。機器學習的領域很多。二、機器學習基本術語數據集、樣本、特征&#xff08;屬性&#xff09;、屬性空間、向量表示、訓練集&#xff08;…

給電腦升級內存,自檢太慢,以為出錯

公司電腦是16G內存&#xff0c;用虛擬機時非常吃力。于是跟領導說&#xff0c;買了32G內存和1T SSD。電腦有兩個SATA數據線&#xff0c;SATA電源頭只有一個。于是買了幾個1轉2&#xff0c;順利接上。把原來的16G拔下&#xff0c;換上32G內存。結果開機沒反應。心里就有點嘀咕&a…

Effective C++ 條款43:學習處理模板化基類內的名稱

Effective C 條款43&#xff1a;學習處理模板化基類內的名稱核心思想&#xff1a;模板化基類&#xff08;templatized base classes&#xff09;中的名稱在派生類模板中默認不可見&#xff0c;需要通過this->前綴、using聲明或顯式基類限定來引入。這是因為編譯器在解析模板…

Mybatis簡單練習注解sql和配置文件sql+注解形式加載+配置文件加載

項目結構 d:\test\runjar\data\static\data\mybatis_helloworld\Mybatis\ ├── lib\ │ ├── asm-3.3.1.jar │ ├── c3p0-0.9.1.2.jar │ ├── cglib-2.2.2.jar │ ├── commons-logging-1.1.1.jar │ ├── ehcache-core-2.6.8.jar │ ├── javassi…

抗日勝利80周年 | HTML頁面

飛翔的和平鴿&#xff1b;屹立的人民英雄紀念碑&#xff1b;倒下的日本國旗&#xff1b;旋轉的金色勛章無不代表著我們勝利了&#xff01;&#xff01;&#xff01;HTML源代碼&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta cha…

web仿寫網站

一、完成自己學習的官網&#xff0c;至少三個不同的頁面。1、界面1&#xff08;1&#xff09;代碼<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

基于element-plus和IndexedDB數據庫的基礎表單

本文介紹了基于Vue 3和Element Plus的表單項目配置頁面實現。頁面包含搜索欄、操作按鈕、數據表格和分頁組件&#xff0c;使用IndexedDB進行本地數據存儲。主要功能包括&#xff1a;1) 通過模糊查詢搜索項目&#xff1b;2) 分頁顯示項目數據&#xff1b;3) 添加/編輯/刪除項目操…

paimon實時數據湖教程-主鍵表更新機制

在上一章&#xff0c;我們學習了 Paimon 如何保證每一次寫入的原子性和一致性。但數據倉庫的核心需求不僅是寫入&#xff0c;更重要的是更新。想象一個場景&#xff1a;我們需要實時更新用戶的最新信息&#xff0c;或者實時累加計算用戶的消費總額。傳統的 Hive 數據湖對此無能…

第十六屆藍橋杯青少組C++省賽[2025.8.9]第二部分編程題(4、矩陣圈層交錯旋轉)

參考程序&#xff1a;#include <bits/stdc.h> using namespace std;const int MAXN 105; int a[MAXN][MAXN];int main() {int n;if (!(cin >> n)) return 0;for (int i 0; i < n; i)for (int j 0; j < n; j)cin >> a[i][j];int layers n / 2; // 每…

【FastGTP?】[01] 使用 FastGPT 搭建簡易 AI 應用

簡易應用&#xff1a;英語單詞解釋 例句 1. 前言 FastGPT 是一個低代碼 AI 應用構建平臺&#xff0c;可以通過簡單配置快速創建自己的 AI 應用。 本文將帶你用 FastGPT 搭建一個 英語單詞解釋 例句 的 AI 工具&#xff0c;輸入英文單詞后&#xff0c;輸出&#xff1a; 單詞…

【Mysql語句練習】

MysqlMysql語句練習一、建庫建表二、插入數據三、查詢Mysql語句練習 一、建庫建表 1、創建數據庫mydb11_stu&#xff0c;并使用數據庫 # 創建數據庫mydb11_stu mysql> create database mydb11_stu; Query OK, 1 row affected (0.00 sec) # 使用數據庫 mysql> use mydb1…

用Python Scrapy征服網絡爬蟲(反爬技術深入剖析)

目錄 第1章:Scrapy是個啥?為什么它是你爬蟲路上的最佳拍檔? 1.1 Scrapy的核心亮點 1.2 啥時候用Scrapy? 1.3 安裝Scrapy 第2章:動手寫你的第一個Scrapy爬蟲 2.1 創建Scrapy項目 2.2 定義數據結構(Items) 2.3 編寫爬蟲邏輯 2.4 運行爬蟲 2.5 小技巧:調試爬蟲 …

解決Electron透明窗口點擊不影響其他應用

遇到的問題&#xff1a;在electron透明窗口點擊&#xff0c;影響窗口下的應用接受不到點擊事件解決方案&#xff1a;CSSIgnoreMouseEvents實現原理&#xff1a;主進程默認設置禁用目標窗口鼠標事件&#xff08;禁用之后能檢測到mousemove&#xff09;&#xff0c;UI進程檢測頁面…

C# 泛型(Generics)詳解

泛型是 C# 2.0 引入的核心特性&#xff0c;它允許在定義類、接口、方法、委托等時使用未指定的類型參數&#xff0c;在使用時再指定具體類型。這種機制可以顯著提高代碼的復用性、類型安全性和性能。一、泛型的核心概念類型參數化泛型允許將類型作為 "參數" 傳遞給類…