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

C++11 override 關鍵字:防止虛函數重寫錯誤的利器

     編輯:關於C++

問題背景

Qt 程序中重寫 `mouseMoveEvent` 卻怎麼也收不到事件。經排查,函數簽名寫錯:

// 錯誤:參數類型應為 QMouseEvent*,寫成了 QMoveEvent*
void mouseMoveEvent(QMoveEvent *event);

這導致隱藏而非重寫基類虛函數,編譯器不報錯,運行時基類指針調用仍調用基類實現。

override 關鍵字作用

C++11 引入 `override`,显式聲明該函數意圖重寫基類虛函數。若簽名不匹配(參數類型、const、引用等任何差異),編譯報錯。

修正後代碼

class MyWidget : public QWidget {
    Q_OBJECT
public:
    MyWidget(QWidget *parent = nullptr);
    ~MyWidget();
protected:
    void mousePressEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override; // 這裡會報錯若寫成 QMoveEvent
};

編譯器報錯示例

error: 'void MyWidget::mouseMoveEvent(QMoveEvent*)' marked 'override', but does not override

編譯要求

  • GCC/Clang:添加 `-std=c++11` 或更高標準旗標。
  • MSVC:默認支持 (VS2015+)。
  • CMake:`set(CMAKE_CXX_STANDARD 11)`

配合 final 使用

  • `override`:強制檢查是否重寫基類虛函數。
  • `final`:禁止繼承類進一步重寫,也可用於類禁止繼承。
class Base {
    virtual void foo() final; // 子類不可重寫
};
class Derived : Base {
    void foo() override; // 錯誤:Base::foo() is final
};

最佳實踐

  1. 所有重寫虛函數**強制加上 `override`**。
  2. 不打算被繼承的類加 `final` (如單例、工具類)。
  3. 葉子類的虛函數加 `final` 避免意外重寫。
  4. 配合編譯警告 `-Woverloaded-virtual` (GCC) 捕獲隱藏問題。

總結

`override` 將運行時多態錯誤前移到編譯期,是現代 C++ 防禦性編程的核心工具之一,極大提高重構安全性。

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