C++ 中提供的override 关键字

C++

不过最近编写一个小程序时代码里有个小

我的那个代码是个利用mouseMoveEvent事件。但是结果怎么也接收不到这个事件。下面是我的程序的一个简化版本。

//MyWidget.h#ifndef MW_H#define MW_H#include <QWidget>class MyWidget : public QWidget{Q_OBJECTpublic:MyWidget(QWidget *parent = 0);~MyWidget(); protected:void mousePressEvent( QMouseEvent * event ) ;void mouseReleaseEvent( QMouseEvent * event ) ;void mouseMoveEvent( QMoveEvent * event ) ;}; #endif//MyWidget.cpp#include "MyWidget.h"#include <QDebug>MyWidget::MyWidget(QWidget *parent):QWidget(parent){}MyWidget::~MyWidget(){}void MyWidget::mousePressEvent( QMouseEvent * event ) {Q_UNUSED(event);qDebug() << "mousePressEvent";}void MyWidget::mouseReleaseEvent( QMouseEvent * event ){Q_UNUSED(event);qDebug() << "mouseReleaseEvent";}void MyWidget::mouseMoveEvent( QMoveEvent * event ){Q_UNUSED(event);qDebug() << "mouseMoveEvent";}//main.cpp#include <QApplication>#include "MyWidget.h"int main(int argc, char **argv){QApplication app(argc, argv);MyWidget win;win.show();return app.exec();} 这个程序运行的结果如下:

我甚至一度认为我用的这个Qt版本出了bug。后来换了好几个Qt版本,甚至于到linux下还试了试,,结果都是一样的。折腾了好几天,最后发现是我把函数原型写错了。本应是:

voidmouseMoveEvent(QMouseEvent*event);

我错写为:

voidmouseMoveEvent(QMoveEvent*event);

而且刚巧Qt中有QMoveEvent这个类,所以这个代码编译时什么错误提示都没有。之所以这里会写错,是因为Qt中有另外一个事件,原型是:

voidmoveEvent(QMoveEvent*event);

最开始我错将这个事件当成鼠标移动事件了,后来发现还有个mouseMoveEvent就随手将函数名改过来了,但是没注意后面的参数类型是不同的,结果就悲剧了。

如果使用了override关键字,这种错误是很容易避免的。

//MyWidget.h#ifndef MW_H#define MW_H#include <QWidget>class MyWidget : public QWidget{Q_OBJECTpublic:MyWidget(QWidget *parent = 0);~MyWidget(); protected:void mousePressEvent( QMouseEvent * event ) override;void mouseReleaseEvent( QMouseEvent * event ) override;void mouseMoveEvent( QMoveEvent * event ) override;}; #endif

再次编译,就会提示

‘voidMyWidget::mouseMoveEvent(QMoveEvent*event)’markedoverride,butdoesnotoverride

不过override 关键字需要编译器支持 C++11。如果使用的是 gcc 编译器,需要加入命令行参数 -std=c++11

接受失败等于回归真实的自我,

C++ 中提供的override 关键字

相关文章:

你感兴趣的文章:

标签云: