框架 vs 庫:誰調用誰?
- 庫:你的代碼調用庫函數(如 STL、Boost);
- 框架:框架調用你的代碼(**控制反轉 IoC**)。你填充預定義的「空白點」(虛函數、回調、事件處理器)。
MFC:經典 C++ 框架剖析
- 全稱 Microsoft Foundation Classes,實為「Application Framework」;
- 核心機制:文檔/視圖架構、消息映射(巨集實現虛函數效果)、動態創建(Runtime Class);
- 你寫
OnButtonClick,MFC 在消息泵中調用它——**框架驅動流程**;
- 缺點:巨集重、無現代 C++ 特性、緊綁 Windows、單繼承限制。
STL 是框架嗎?不是,它是庫
STL 提供容器、算法、迭代器,**你主動調用** std::sort、vector::push_back。無預定義流程,無控制反轉。
框架實現的核心技術
- 虛函數(動態多態):基類定義流程骨架,派生類覆寫具體步驟(Template Method 模式);
- 回調函數/函數指針:C 風格 IoC,如
qsort 比較函數、Windows 回調;
- 信號/槽:Qt 的解耦機制,編譯期類型安全;
- 依賴注入 (DI):現代框架核心,構造函數/Setter 注入依賴,便於測試與替換。
知名 C++ 框架概覽
| 框架 | 領域 | 特點 |
| MFC | Windows 桌面 | 微軟官方、歷史包袱重 |
| Qt | 跨平台 GUI/非 GUI | 信號槽、QML、商業/GPL 雙授權 |
| wxWidgets | 跨平台 GUI | 原生外觀、LGPL、MFC 風格 |
| ACE | 高性能網絡/並發 | Reactor/Proactor、模式豐富 |
| POCO | 網絡/企業級應用 | 現代 C++、模塊化、MIT 許可 |
| Wt | Web 應用 | C++ 寫 Web、類 Qt API |
插件系統也是框架一種
Winamp、Firefox、Eclipse、VS Code——**宿主定義擴展點,插件實現契約**。Eclipse 基於 OSGi,是標準框架+插件架構典範。
Linux 內核模塊:系統級框架
驅動註冊 module_init/exit、file_operations 結構體——內核調用驅動入口,**典型的控制反轉**。
現代 C++ 框架設計原則
- **接口隔離**:依賴抽象而非具體;
- **組合優於繼承**:策略模式、裝飾器替代深層繼承樹;
- **無侵入性**:業務類無需繼承框架基類(如 POCO、Boost.Asio);
- **編譯期多態**:模板、Concepts (C++20) 替代虛函數開銷;
- **異步優先**:協程、Future/Promise、Actor 模型。
結語
理解「框架調用你」的本質,能幫你快速上手任何新框架:**找到擴展點、實現契約、交給框架調度**。現代 C++ 框架正從繼承/巨集轉向組合/模板/協程,保持學習,擁抱變化。