Qt 程序中重寫 `mouseMoveEvent` 卻怎麼也收不到事件。經排查,函數簽名寫錯:
// 錯誤:參數類型應為 QMouseEvent*,寫成了 QMoveEvent*
void mouseMoveEvent(QMoveEvent *event);
這導致隱藏而非重寫基類虛函數,編譯器不報錯,運行時基類指針調用仍調用基類實現。
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
class Base {
virtual void foo() final; // 子類不可重寫
};
class Derived : Base {
void foo() override; // 錯誤:Base::foo() is final
};
`override` 將運行時多態錯誤前移到編譯期,是現代 C++ 防禦性編程的核心工具之一,極大提高重構安全性。