定義
- 靜態類型:宣告時的類型(編譯期已知)。
- 動態類型:指標/參考實際指向的物件類型(執行期決定)。
- 靜態綁定:根據靜態類型解析函式/屬性(編譯期)。非虛擬函式、多載解析、模板實例化。
- 動態綁定:根據動態類型解析虛擬函式(執行期)。需虛擬函式 + 基類別指標/參考。
程式碼示範
class A { public: /*virtual*/ void func() { cout << "A::func\n"; } };
class B : public A { public: void func() { cout << "B::func\n"; } };
class C : public A { public: void func() { cout << "C::func\n"; } };
int main() {
A* pa = new B;
pa->func(); // 無 virtual:靜態綁定呼叫 A::func
// 有 virtual:動態綁定呼叫 B::func
}
關鍵差異
| 特性 | 靜態綁定 | 動態綁定 |
| 解析時機 | 編譯期 | 執行期 |
| 依據 | 靜態類型 | 動態類型 |
| 函式類型 | 非虛擬、模板、多載 | 虛擬函式 |
| 效能 | 較快(直接呼叫/內聯) | 稍慢(虛擬表查找) |
| 彈性 | 低 | 高(多態) |
最佳實務
- 預設非虛擬,需要多態時才加
virtual。
- 基類別解構函式必須為虛擬。
- 使用
final、override 明確意圖並獲編譯器檢查。