首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 重載、覆蓋與隱藏:核心區別與陷阱實例

     編輯:關於C語言

三大概念速查表

特性重載覆蓋隱藏
發生範圍同一作用域基類/派生類基類/派生類
函數簽名同名、參數不同同名、參數相同同名、參數任意
關鍵字無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 隱式轉換。
  • 覆蓋是多態的,存在於 vtable;隱藏是靜態的,編譯期決定。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved