繫結:函式本體與呼叫點的關聯。編譯/連結階段完成為早期繫結 (C 語言唯一模式);執行期動態決定為晚期繫結 (動態繫結/執行期繫結)。
基類函式前加 virtual,告知編譯器採用晚期繫結,自動建構實作機制:
#include <typeinfo.h>
#include <iostream.h>
class Base {
public:
virtual void f() { cout << "Base-print" << endl; }
};
class Derived : public Base {
public:
void f() { cout << "Derived-print" << endl; }
};
void main() {
Base* b; // (1)
Derived* d; // (2)
b = d; // (3) 基類指標指向衍生類物件
b->f(); // (4) 晚期繫結:呼叫 Derived::f()
}
Derived-print
b (Base*) → Derived 物件
├─ VPTR ──────────→ VTABLE (Derived)
│ ├─ f() → Derived::f()
│ └─ ...
└─ Base 成員資料
└─ Derived 成員資料
關鍵點:b = d 時,b 指向 Derived 物件開頭,其 VPTR 指向 Derived 的 VTABLE。呼叫 b->f() 時,編譯器產生間接呼叫碼:取 VPTR → 索引 VTABLE → 跳轉實際函式位址,實現多型。