void output(int x) { cout << "int " << x << endl; }
void output(float x){ cout << "float " << x << endl; }
output(1); // OK: int
output(1.0f); // OK: float
// output(0.5); // Error: 0.5 是 double,可隱式轉 int 或 float → 模稜兩可
output(int(0.5)); // OK: 強制轉 int → 0
output(float(0.5)); // OK: 強制轉 float → 0.5
解決:明確轉型或避免同名多載接受可隱式轉換的型別(如 int/float/double 混用)。
| 特性 | 多載 | 覆蓋 | 隱藏 |
|---|---|---|---|
| 範圍 | 同一類別 | 基類/衍生類 | 基類/衍生類 |
| 名稱 | 相同 | 相同 | 相同 |
| 參數 | 不同 | 相同 | 相同或不同 |
| virtual | 可有可無 | 基類必須 virtual | 無關 |
| 目的 | 同名不同參 | 多型行為 | 非預期遮蔽 |
class Base {
public:
virtual void f(float) { cout << "Base::f(float)"; }
void g(float) { cout << "Base::g(float)"; }
void h(float) { cout << "Base::h(float)"; }
};
class Derived : public Base {
public:
virtual void f(float) { cout << "Derived::f(float)"; } // 覆蓋
void g(int) { cout << "Derived::g(int)"; } // 隱藏 Base::g(float)
void h(float) { cout << "Derived::h(float)"; } // 隱藏 Base::h(float) (非 virtual)
};
Derived d;
Base* pb = &d;
Derived* pd = &d;
pb->f(3.14f); // Derived::f(float) 虛函數動態繫結
pd->f(3.14f); // Derived::f(float)
pb->g(3.14f); // Base::g(float) 非虛函數靜態繫結 → 隱藏導致基類版本被呼叫
pd->g(3.14f); // Derived::g(int) 隱藏版本,3.14f 隱式轉 int → 3
pb->h(3.14f); // Base::h(float) 同 g
pd->h(3.14f); // Derived::h(float) 隱藏版本
隱藏導致靜態繫結行為隨指標型別改變,極易產生難以發現的 Bug。