void output(int x);
void output(float x);
output(1); // ✅ 呼叫 int 版
output(1.0f); // ✅ 呼叫 float 版
output(0.5); // ❌ 編譯錯誤:0.5 是 double,轉 int 或 float 皆可,編譯器無法決策
// 顯式轉型消除二義性
output(static_cast(0.5)); // output int 0
output(static_cast(0.5)); // output float 0.5
**隱式轉換雖便利,卻是二義性溫床**。關鍵呼叫處**務必顯式轉型**。
| 特徵 | 重載 | 覆寫 | 隱藏 |
|---|---|---|---|
| 範圍 | 同一類別 | 派生類 vs 基類 | 派生類 vs 基類 |
| 函數名 | 相同 | 相同 | 相同 |
| 參數 | 不同 | 相同 | 同或不同 |
| virtual | 可有可無 | 基類**必須有** | 無關 |
| 關係 | 平行 | 取代 | 屏蔽 |
class Base {
public:
void f(int x) { cout << "Base::f(int) " << x; }
void f(float x) { cout << "Base::f(float) " << x; } // 重載
virtual void g() { cout << "Base::g()"; }
};
class Derived : public Base {
public:
virtual void g() { cout << "Derived::g()"; } // 覆寫
};
Derived d;
Base* pb = &d;
pb->f(42); // Base::f(int) 42
pb->f(3.14f); // Base::f(float) 3.14
pb->g(); // Derived::g() 多態生效
**重載**解決「同類別不同參數」;**覆寫**實現「多態替換」;**隱藏**是**陷阱**,須主動破解。