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

C++ 靜態聯編與動態聯編:多態實現的兩種機制

     編輯:VC 教學

定義

  • 靜態聯編 (Static Binding / Early Binding):編譯連結階段確定函數呼叫目標。又稱靜態繫結。
  • 動態聯編 (Dynamic Binding / Late Binding):程式執行期根據物件實際型別決定呼叫目標。又稱動態繫結、虛函數機制。

程式碼演示


#include 
using namespace std;

class Point {
    double x, y;
public:
    Point(double i, double j) : x(i), y(j) {}
    double Area() const { return 0.0; } // 非 virtual
};

class Rectangle : public Point {
    double w, h;
public:
    Rectangle(double i, double j, double k, double l)
        : Point(i, j), w(k), h(l) {}
    double Area() const { return w * h; } // 隱藏基類 Area
};

void fun(Point& s) {
    cout << s.Area() << endl; // 靜態聯編:永遠呼叫 Point::Area()
}

int main() {
    Rectangle rec(3.0, 5.2, 15.0, 25.0);
    fun(rec); // 輸出 0 (期望 375)
    return 0;
}

原因:fun 參數型別為 Point&,編譯器僅知靜態型別,將 s.Area() 繫結至 Point::Area。

動態聯編修正


class Point {
    // ...
    virtual double Area() const { return 0.0; } // 加上 virtual
};

class Rectangle : public Point {
    // ...
    double Area() const override { return w * h; } // 覆寫
};

// fun 不變
// 輸出 375 (正確)

機制:
1. 編譯器為含 virtual 函數的類別產生虛函數表 (vtbl)。
2. 每個物件內含 vptr 指向其類別的 vtbl。
3. 呼叫 s.Area() 時,編譯器產生間接呼叫碼:s.vptr->Area()。
4. 執行期 s 實際指向 Rectangle 物件,vptr 指向 Rectangle::vtbl,故呼叫 Rectangle::Area。

聯編與多態的關係

  • 靜態聯編:依**靜態型別** (宣告型別) 選擇實現 → **編譯期多態** (函數多載、模板)。
  • 動態聯編:依**動態型別** (實際物件型別) 選擇實現 → **執行期多態** (虛函數)。

兩者皆為多態表現,只是綁定時機不同。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved