第十章 類、對象與實現:面向對象核心概念、內存模型、繼承、多態、抽象類與接口深度解析
本章系統闡述面向對象編程(OOP)的理論基石與工程實現細節:從變量與表的底層存儲模型,到類、對象、繼承、多態、抽象類、接口的語義與實現機制,再到消息傳遞、訪問控制、構造/析構的生命周期管理。
一、變量與表:底層存儲模型
- 變量:標識一塊可變內存區域。編譯期分配邏輯地址,形成符號表;運行期對應物理地址。
- 表:行對齊(8 字)的位容器集合。對象屬性表、方法表、全局表、動態對象頭表構成運行時核心數據結構。
- 內存區域:
- 寄存器:自動變量(局部變量)。
- 棧:臨時基本類型、局部變量、調用幀。自動清理。
- 堆:動態對象、動態數組。手動/GC 管理。
- 常量池:字面量、靜態常量。
- 編譯器翻譯原則:4W 變量優先對齊,動態引用集中表頭,空洞填充小變量。
二、面向對象核心三要素
| 特性 | 定義 | 實現關鍵 |
| 封裝 | 數據與操作綁定,隱藏內部細節 | private 屬性 + public 方法,friend 破壞封裝 |
| 繼承 | 子類共享父類結構與行為 | 單/多重繼承,虛繼承解決菱形問題,類繼承關系數組 |
| 多態 | 同一操作作用於不同對象產生不同行為 | 虛函數表、動態綁定、抽象類/接口定義契約 |
三、類與對象實現細節
- 類:對象模板,包含屬性表模板與方法表(唯一,全體對象共享)。
- 對象:類的實例,擁有獨立屬性表實例,共享方法表。唯一標識 =
類號 + 對象號。
- 類表:金字塔樹狀結構。純抽象類(接口/概念類)→ 普通抽象類 → 具體類。每類項含:繼承關系數組、子類數組、方法表指針、屬性表描述、對象計數。
- 對象頭表:對象號 → 屬性表入口指針(塊號、行始址)、大小、引用計數。
四、繼承機制深度解析
- 單重繼承:線性鏈,子類擁有父類所有成員,可新增、覆寫。
- 多重繼承:類繼承關系數組記錄所有祖先(去重)。APO 自然支持,無菱形副本問題(關系數組唯一)。
- 二義性解決:
- 同名成員:作用域限定符
Base::member。
- 菱形繼承:虛繼承(共享虛基類唯一實例),或語言級深度優先搜索(Python)。
- Mix-in 模式:無狀態抽象類,提供行為片段組合,避免菱形,Ruby 模塊即此思想。
五、多態與虛函數實現
- 虛函數表:每類一張,存虛函數入口地址。對象隱含
vptr 指向其類的 vtable。
- 動態綁定:
obj->virt() 編譯為 obj->vptr[virt_index](),運行時根據對象真實類型分派。
- 純虛函數:
=0,強制子類實現,類成為抽象類(不可實例化)。
六、抽象類與接口
| 維度 | 抽象類 | 接口 |
| 關鍵字 | abstract class / 含純虛函數 | interface / 純抽象類變體 |
| 成員 | 可含屬性、普通方法、純虛方法 | 僅含抽象方法(隱式 public abstract) |
| 繼承 | 單繼承(C++ 多繼承) | 多實現 |
| 語義 | is-a:本質分類 | can-do:行為契約 |
| 構造函數 | 可有(供子類調用) | 無 |
APO 統一觀:接口是抽象類的行為子集;抽象類可包含接口;兩者均為類表節點。
七、訪問控制與最佳實踐
public:介面,全可訪問。
protected:繼承層級可訪問,外部不可。
private:僅本類可訪問,封裝核心。
- 原則:屬性
private,方法 public,繼承需用 protected。對象調方法,方法改屬性。
八、消息與方法
- 消息:對象間通信單元,含
目標對象, 方法名, 參數。
- 方法:類中操作實現,唯一份代碼,全體對象共享。重載(同名不同參數)、重寫(覆蓋父類虛函數)。
- 調用機制:
類名.方法名 或 對象名.方法名 → 符號表查類號/對象號/方法入口 → 設置數據塊、跳轉入口。
總結
面向對象編程的本質是數據與操作的封裝、類型層次的抽象、運行時行為的多態分派。理解底層表結構、內存佈局、虛表機制、繼承關系數組,能寫出高效、健壯、可擴展的 C++/系統級代碼。現代語言雖語法糖豐富,但核心模型不變。
- 上一篇文章: Codeforces 484A Bits:區間內 1 比特數最大的最小數構造
- 下一篇文章: hihoCoder 1075 開鎖魔法III:動態規劃與組合數學解析
Copyright ©
程式碼之家 All Rights Reserved