| 特性 | 重載 | 覆蓋 | 隱藏 |
|---|---|---|---|
| 發生範圍 | 同一作用域 | 基類/派生類 | 基類/派生類 |
| 函數簽名 | 同名、參數不同 | 同名、參數相同 | 同名、參數任意 |
| 關鍵字 | 無 | virtual | 無 |
| 綁定時機 | 編譯期(靜態) | 執行期(動態) | 編譯期(靜態) |
| 多態性 | 無 | 有 | 無 |
同一作用域內,同名函數參數列表不同(類型/個數/順序)。返回類型不參與重載區分。
派生類重新定義基類 virtual 函數,簽名完全相同。透過基類指標/引用調用時發生動態派發。
派生類定義同名函數(無論參數是否相同),導致基類同名函數在派生類作用域不可見。編譯器由內而外查找,找到即停止。
virtual → 隱藏virtual → 覆蓋class Base {
public:
virtual void f(float x) { cout << "Base::f(float)" << x; }
void g(float x) { cout << "Base::g(float)" << x; }
};
class Derived : public Base {
public:
virtual void f(float x) { cout << "Derived::f(float)" << x; } // 覆蓋
void g(int x) { cout << "Derived::g(int)" << x; } // 隱藏!
};
int main() {
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) 隱藏生效,float 隱式轉 int
}
pb->g(3.14f) 調用 Base::g(float):靜態類型為 Base*,g 非虛函數,編譯期綁定。pd->g(3.14f) 調用 Derived::g(int):靜態類型為 Derived*,編譯器在 Derived 找到 g(int),隱藏基類 g(float),發生 float→int 隱式轉換。