連結是指程式碼中操作呼叫與實際執行代碼建立關聯的過程。依據發生階段不同,分為靜態連結(早期連結)與動態連結(晚期連結),兩者均屬多型機制範疇,分別對應靜態型別與動態型別的選擇。
連結工作在編譯連結階段完成,程式執行前已確定呼叫關係。又稱靜態綁定。
class Point {
public:
Point(double i, double j) : x(i), y(j) {}
double Area() const { return 0.0; }
private:
double x, y;
};
class Rectangle : public Point {
public:
Rectangle(double i, double j, double k, double l) : Point(i, j), w(k), h(l) {}
double Area() const { return w * h; }
private:
double w, h;
};
void fun(Point &s) {
cout << s.Area(); // 輸出 0
}
int main() {
Rectangle rec(3.0, 5.2, 15.0, 25.0);
fun(rec);
}
結果輸出 0。原因:編譯期 s 靜態型別為 Point&,Area() 綁定至 Point::Area()。無法依據實際物件型別 (Rectangle) 動態分派。
編譯期無法確定確切呼叫函數,需在執行時根據物件實際型別綁定。又稱動態綁定、晚期連結。實現基於虛擬函數機制。
| 特性 | 靜態連結 | 動態連結 |
|---|---|---|
| 決議時機 | 編譯連結期 | 執行期 |
| 型別依據 | 靜態型別 (宣告型別) | 動態型別 (實際物件型別) |
| 實現機制 | 直接函數呼叫 | 虛函數表 (vtable) + 虛函數指標 (vptr) |
| 效能 | 極快,無間接開銷 | 一次間接查找開銷 |
| 適用場景 | 非多型行為、效能關鍵路徑 | 多型行為、框架擴充點 |
靜態/動態連結本質上是對參數多型的兩種選擇策略:
C++ 規定:僅虛函數支援動態連結。非虛函數永遠靜態連結。這是 C++「不為未使用特性付費」哲學的體現。
virtual