首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 繼承同名函數遮蔽:基類非虛函數導致指標調用基類版本

     編輯:程式設計疑難解答

派生類定義與基類同名函數 display(),基類指標指向派生對象調用時,執行的是基類版本。原因:基類函數未聲明 virtual,編譯器進行靜態綁定,根據指標類型 (基類) 決定調用哪個函數。

程式碼對比

class Base {
public:
    void display() { cout << "Base"; } // 非虛函數
};

class Derived : public Base {
public:
    void display() { cout << "Derived"; } // 遮蔽而非覆寫
};

Base* ptr = new Derived();
ptr->display(); // 輸出 "Base" - 靜態綁定

修正:加上 virtual

class Base {
public:
    virtual void display() { cout << "Base"; } // 動態綁定
};

class Derived : public Base {
public:
    void display() override { cout << "Derived"; } // 覆寫
};

Base* ptr = new Derived();
ptr->display(); // 輸出 "Derived" - 多態生效

核心法則

  1. 指標/引用調用:若基類函數 virtual,執行動態綁定 (看對象實際類型);否則靜態綁定 (看指標聲明類型)。
  2. 對象直接調用:永遠靜態綁定,Derived d; d.display(); 調用派生版本。
  3. 遮蔽 vs 覆寫:無 virtual 時派生類同名函數為遮蔽,基類指標無法調用;有 virtual 才是覆寫,支援多態。

最佳實務:基類析構函數必須 virtual,任何擬供多態的函數均加 virtual (C++11 建議加 override 防錯)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved