面向對象設計

你列出的這些屬于 C++ 高級開發中面向對象設計與架構設計的核心知識,也是面試高級工程師崗位必問的內容。下面我按順序,深入講解每一項概念、原理、用途,并穿插 C++ 示例。


? 1. 設計原則(SOLID)

SOLID 是面向對象設計的五大原則,有助于寫出可維護、可擴展、低耦合、高內聚的代碼。

縮寫名稱含義
S單一職責原則 (SRP)每個類只有一個引起它變化的原因。
O開閉原則 (OCP)對擴展開放,對修改關閉。
L里氏替換原則 (LSP)子類應能替代父類并正確運行。
I接口隔離原則 (ISP)不應強迫客戶端依賴不使用的接口。
D依賴倒置原則 (DIP)高層模塊不應依賴底層模塊,二者都依賴抽象。

示例(開閉原則):

class Shape {
public:virtual double area() const = 0;virtual ~Shape() = default;
};class Circle : public Shape {double r;
public:Circle(double r) : r(r) {}double area() const override { return 3.14 * r * r; }
};class Square : public Shape {double s;
public:Square(double s) : s(s) {}double area() const override { return s * s; }
};// 對擴展開放,對修改關閉
double totalArea(const std::vector<std::shared_ptr<Shape>>& shapes) {double sum = 0;for (auto& s : shapes) {sum += s->area();  // 多態支持}return sum;
}

? 2. 設計模式(單例、工廠、觀察者、策略、模板方法等)

常見設計模式:

模式用途
單例模式系統中只允許一個類的實例存在。
工廠模式將對象創建的邏輯封裝起來,解耦使用者與實現。
觀察者模式一對多通知機制,發布-訂閱。
策略模式封裝行為,動態選擇策略實現。
模板方法模式父類定義流程,子類實現具體步驟。

單例模式(懶漢線程安全)

class Singleton {
private:Singleton() {}
public:static Singleton& getInstance() {static Singleton instance;return instance;}void doSomething() {}
};

? 3. 虛函數、多態、純虛函數與接口設計

  • 虛函數:允許子類重寫,支持運行時多態。
  • 純虛函數:用 = 0 表示,是接口設計的核心。
  • 接口類:只包含純虛函數,無成員變量。

示例:

class IShape {
public:virtual double area() const = 0;  // 純虛函數virtual ~IShape() = default;
};class Rectangle : public IShape {double w, h;
public:Rectangle(double w, double h) : w(w), h(h) {}double area() const override { return w * h; }
};

? 4. 多繼承與虛繼承

  • 多繼承:一個類繼承多個基類,容易造成二義性。
  • 虛繼承:解決“菱形繼承”中基類重復問題。

示例(虛繼承):

class A {
public:int x;
};class B : virtual public A {};
class C : virtual public A {};class D : public B, public C {
public:void setX(int val) { x = val; }  // x不再重復
};

? 5. 對象生命周期管理

C++ 對象生命周期分為:

  • 靜態對象:程序開始時分配,結束時銷毀(如全局變量)。
  • 自動對象:函數棧幀上的局部變量,函數結束時自動銷毀。
  • 動態對象:通過 new 分配,必須手動或用智能指針釋放。
  • 臨時對象:表達式中創建,使用后自動銷毀。

要點:

  • 避免使用裸 new / delete
  • 配合 RAII 和智能指針自動管理資源

? 6. RAII(資源獲取即初始化)

RAII 是 C++ 的重要資源管理機制,通過對象構造/析構自動管理資源(如文件、鎖、內存)。

示例(文件RAII封裝):

class FileWrapper {FILE* fp;
public:FileWrapper(const char* filename, const char* mode) {fp = fopen(filename, mode);if (!fp) throw std::runtime_error("打開文件失敗");}~FileWrapper() {if (fp) fclose(fp);}FILE* get() { return fp; }
};

總結

技術點關鍵詞作用
SOLID 原則SRP, OCP, LSP, ISP, DIP提升代碼可維護性、可擴展性
設計模式單例、工廠、觀察者等應對常見場景的架構模式
多態虛函數、純虛函數提供接口抽象與多態行為
多繼承虛繼承解決菱形繼承的問題
生命周期棧、堆、臨時對象資源正確創建與釋放
RAII構造申請,析構釋放避免資源泄露,異常安全

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

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

相關文章

IntelliJ IDEA讓我的開發效率翻倍:從新手到高效開發者的進階之路

IntelliJ IDEA讓我的開發效率翻倍&#xff1a;從新手到高效開發者的進階之路 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 總有一行代碼&#xff0c;能點亮萬千星辰。 &#x1f50d; 在技術的宇宙中&#xff0c;我愿做永不停歇的探索者。 ? 用…

css sprites使用

CSS Sprites 是一種將多個小圖標或背景圖像合并到一個大圖中的技術。通過減少HTTP請求次數&#xff0c;可以顯著提高頁面加載速度。其核心原理是&#xff1a;通過設置元素的背景圖&#xff08;background-image&#xff09;為這個大圖&#xff0c;然后調整背景位置&#xff08;…

分布式爬蟲在電商平臺商品數據大規模采集中的技術應用

在電商平臺商品數據大規模采集場景中&#xff0c;分布式爬蟲憑借其高效、可擴展、抗風險的特性&#xff0c;成為突破單節點爬蟲性能瓶頸的核心技術方案。以下從技術架構、關鍵技術點、電商場景適配及挑戰應對四個維度&#xff0c;解析其具體應用&#xff1a;一、分布式爬蟲的核…

Linux的`if test`和`if [ ]中括號`的取反語法比較 筆記250709

Linux的if test和if 中括號的取反語法比較 筆記250709 Linux的 test命令&#xff08;或等價中括號寫法 [空格expression空格]&#xff09;的用法詳解. 筆記250709 四種取反語法: if ! test -e xxx ;then... 和 if test ! -e xxx ;then... 和 if ! [ -e xxx ] ;then... 和 if …

記錄使用ubuntu16.04編譯aosp(android8.1與10)遇到的問題

一、前言&#xff1a; 本來打算用wsl來編譯AOSP&#xff0c;但是折騰了好幾天&#xff0c;以失敗告終。后來使用vmware反而成功了。 本篇同樣會把wsl遇到的問題與嘗試記錄下來。 環境&#xff1a;vmware ubuntu16.04。 為什么會使用ubuntu16.04呢&#xff0c;因為在公司有一…

hiredis window之RFDMap

簡介 RFDMap用于將socket分配映射成連續的文件描述符&#xff0c;同時管理回收的文件描述符&#xff0c;因為ae構架中管理fd與對應事件處理器使用的是數據&#xff0c;fd作為數組下標 結構 #mermaid-svg-zQz2LTrKRi0LQTII {font-family:"trebuchet ms",verdana,arial…

RustFS一款Rust 驅動的 高性能 分布式存儲系統

演示地址&#xff1a;https://play.rustfs.com/browser 訪問賬號&#xff08;默認 rustfsadmin&#xff09;。 訪問密鑰&#xff08;默認 rustfsadmin&#xff09;。 下載mc https://dl.min.io/client/mc/release可以直接在 Linux 系統上安裝 mc&#xff08;&#xff0c;然后訪…

微軟 Bluetooth LE Explorer 實用工具的詳細使用分析

微軟 Bluetooth LE Explorer 實用工具的詳細使用分析 文章目錄 微軟 **Bluetooth LE Explorer** 實用工具的詳細使用分析1. **工具定位與核心功能**2. **關鍵特性與更新**3. **使用場景示例**4. **系統要求與依賴**5. **與專業工具對比**6. **局限性**7. **實踐建議**結論以下是…

centos 7.6安裝mysql8

在 CentOS 7.6 上安裝 MySQL 8.0.42 的步驟如下&#xff0c;基于搜索結果中的最新信息&#xff1a; 下載 MySQL 8.0.42 安裝包 https://dev.mysql.com/downloads/mysql/從 MySQL 官方網站下載 mysql-8.0.42-1.el7.x86_64.rpm-bundle.tar 文件&#xff1a; 官方下載地址&#xf…

CentOS7更換阿里云yum源

問題&#xff1a;剛剛在本地安裝了CentOS7虛擬機&#xff0c;使用yum安裝vim軟件時&#xff08;最小化安裝只有vi沒有vim&#xff09;出現下面的報錯原因 &#xff1a;CentOS7 已于2024-6-30停止維護&#xff0c;官方鏡像源已不可用&#xff0c;可以更換為阿里云鏡像源解決&…

UE5內置插件 AnimToTexture 簡單入門

開啟插件 首先安裝插件&#xff0c;然后重啟。打開顯示插件內容我們就可以找到插件自帶的轉換內容將骨骼網格體轉換為頂點動畫有兩種方式&#xff1a; 最簡單的記錄每個頂點的位置然后通過切換拾取顏色偏移實現記錄骨骼的變換&#xff0c;然后通過貼圖去修改骨骼位置計算 這兩種…

如何搭建Appium環境?

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快1、安裝Java Development Kit&#xff08;JDK&#xff09;前往Oracle官網下載JDK。在https://www.oracle.com/java/technologies/javase-jdk11-downloads.html 找到…

Android kotlin 協程的詳細使用指南

Android Kotlin 協程的詳細使用指南&#xff0c;結合核心概念、實戰場景和最佳實踐&#xff1a;一、協程基礎概念?協程本質?協程是輕量級線程&#xff0c;通過掛起/恢復機制實現并發&#xff0c;相比線程節省90%以上的內存開銷。其核心優勢在于結構化并發和掛起函數的協作式調…

什么是 AMR 格式?簡鹿音頻轉換器輕松批量轉換 AMR 為 MP3

AMR 格式是一種比較特殊但又常見的音頻格式&#xff0c;而MP3 格式則是大家耳熟能詳的通用音頻格式。那么&#xff0c;它們之間有什么區別&#xff1f;又該如何把 AMR 文件轉換成更常用的 MP3 呢&#xff1f;下面我們就來通俗地了解一下。一、什么是 AMR 格式&#xff1f;AMR&a…

C++11 std::move與std::move_backward深度解析

文章目錄移動語義的革命性意義std::move&#xff1a;正向范圍移動函數原型與核心功能關鍵特性與實現原理適用場景與代碼示例危險區域&#xff1a;重疊范圍的未定義行為std::move_backward&#xff1a;反向安全移動函數原型與核心功能關鍵特性與實現原理適用場景與代碼示例重疊范…

訂單初版—2.生單鏈路中的技術問題說明文檔

大綱1.生單鏈路的業務代碼2.生單鏈路中可能會出現數據不一致的問題3.Seata AT模式下的分布式事務的原理4.Seata AT模式下的分布式事務的讀寫隔離原理5.Seata AT模式下的死鎖問題以及超時機制6.Seata AT模式下的讀寫隔離機制的影響7.生單鏈路使用Seata AT模式的具體步驟8.生單鏈…

跨平臺ROS2視覺數據流:服務器運行IsaacSim+Foxglove本地可視化全攻略

任務目標 本教程將完整實現&#xff1a; 在服務器無頭模式下運行IsaacSim&#xff0c;并在本地顯示GUI界面 通過IsaacSim的ROS2 Bridge發布圖像數據 在本地Foxglove中實時可視化服務器端的ROS2數據流 實現步驟 1. 服務器無頭運行IsaacSim 本地GUI顯示 在服務器端執行&am…

【機器學習筆記Ⅰ】 8 多元梯度下降法

多元線性回歸的梯度下降法詳解 多元線性回歸&#xff08;Multiple Linear Regression&#xff09;是多個自變量&#xff08;特征&#xff09;與一個因變量&#xff08;目標&#xff09;之間的線性關系建模&#xff0c;梯度下降法用于優化模型參數&#xff08;權重和偏置&#x…

C++——從結構體到類與對象

C 類與對象詳解&#xff1a;從結構體到面向對象編程C 的面向對象編程&#xff08;OOP&#xff09;核心是 類&#xff08;Class&#xff09; 和 對象&#xff08;Object&#xff09;。類是用戶自定義的數據類型&#xff0c;用于封裝數據&#xff08;屬性&#xff09;和操作數據的…

專題:2025數據資產AI價值化:安全、戰略與應用報告|附400+份報告PDF、原數據表匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p42885 在數字經濟加速滲透的今天&#xff0c;數據作為核心生產要素的價值愈發凸顯。上市公司作為經濟高質量發展的微觀主體&#xff0c;其數據價值化進程不僅關乎企業自身競爭力&#xff0c;更折射出中國產業數字化轉型的深度與廣度。…