你列出的這些屬于 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 | 構造申請,析構釋放 | 避免資源泄露,異常安全 |