首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

面向對象語言理論(一):基於類的 OO 核心特征——對象、方法解析、繼承

     編輯:關於C++

基於類 vs 基於對象

  • 基於類:Simula、Smalltalk、C++、Java、C#。類描述對象共同結構,對象為類實例。
  • 基於對象:Self、JavaScript(原型鏈)、Lua。無類概念,對象直接繼承/委派其他對象。

1. 類與對象

類定義示例

class cell {
    var contents: Integer := 0;
    method get(): Integer { return self.contents; }
    method set(n: Integer) { self.contents := n; }
}

self 代表對象自身。對象內部為指向屬性集的指針,賦值/傳參傳遞指針,實現共享。

實例化與類型

var myCell: InstanceTypeOf(cell) := new cell;
  • new cell:分配屬性存儲,初始化,綁定方法代碼,返回指針。
  • InstanceTypeOf(cell):對象類型,區別於 class,為後續子類型多態鋪路。

2. 方法解析

  • 直觀上方法代碼內嵌對象,但為節省空間,實際共享 Method Suite(方法表)。
  • 對象持有指向 Method Suite 的指針,解析順著指針查找。
  • 繼承下 Method Suite 形成樹/圖(多重繼承)。
  • 靜態類型語言(C++、Java)編譯期扁平化合併 Method Suite(vtable),解析 O(1)。
  • 動態類型語言運行期搜索繼承鏈/圖。
  • 方法不可像屬性那樣提取、更新、作為一等函數傳遞。

3. 子類化與繼承

子類定義

subclass reCell of cell {
    var backup: Integer := 0;
    override set(n: Integer) {
        self.backup := self.contents;
        super.set(n);
    }
    method restore() { self.contents := self.backup; }
}
  • 屬性隱式複製,可新增、覆寫(甚至改變類型)。
  • 方法複製或覆寫,super 調用父類版本。

方法解析差異

C++ vtable 即編譯期扁平化 Method Suite 的經典實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
語言類型Method Suite 構建時機解析複雜度
靜態類型編譯期,扁平化合併O(1) 直接索引
動態類型運行期,動態生成樹/圖O(深度) 搜索