程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ 中提供的override 關鍵字

C++ 中提供的override 關鍵字

編輯:關於C++

C++ 語言標准這些年進化的很快,許多新引入的特性我都沒有用過。說實話自己也比較懶,總是覺得自己對C++ 的掌握程度已經足夠應付日常的各種項目了,所以沒有學習新特性的動力。而且一直覺得新引入的特性多數都屬於那種“語法糖”,能夠發揮的作用不大,其實是可有可無的。

不過最近編寫一個小程序時代碼裡有個小bug,困擾了我好幾天。最後在幾個熱心網友的幫助下才解決了。這個小bug讓我認識到C++11 中提供的override 關鍵字非常有用,下面就簡單的說說我代碼中的那個小bug。

我的那個代碼是個利用Qt 寫的GUI程序,程序中需要響應鼠標的mouseMoveEvent 事件。但是結果怎麼也接收不到這個事件。下面是我的程序的一個簡化版本。

//MyWidget.h
#ifndef MW_H
#define MW_H
#include 
class MyWidget : public QWidget
{
     Q_OBJECT
public:
     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 
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 
#include "MyWidget.h"
int main(int argc, char **argv)
{
     QApplication app(argc, argv);
MyWidget win;
     win.show();
     return app.exec();
} 

這個程序運行的結果如下:

\

我甚至一度認為我用的這個Qt版本出了bug。後來換了好幾個Qt版本,甚至於到linux下還試了試,結果都是一樣的。折騰了好幾天,最後發現是我把函數原型寫錯了。本應是:

void mouseMoveEvent( QMouseEvent * event );

我錯寫為:

void mouseMoveEvent( QMoveEvent * event );<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+IDwvcD4KPHA+tvjH0rjVx8kgUXTW0NPQIFFNb3ZlRXZlbnQg1eK49sDgo6zL+dLU1eK49rT6wuux4NLryrHKssO0tO3O88zhyr62vMO709Cho9auy/nS1NXiwO+74dC0tO2jrMrH0vLOqlF01tDT0MHtzeLSu7j2ysK8/qOs1K3QzcrHo7o8L3A+CjxwPnZvaWQgbW92ZUV2ZW50KCBRTW92ZUV2ZW50ICogZXZlbnQgKTs8L3A+CjxwPiA8L3A+CjxwPtfuv6rKvM7StO29q9XiuPbKwrz+tbGzycrzserSxravysK8/sHLo6y688C0t6LP1ru509C49m1vdXNlTW92ZUV2ZW50vs3L5srWvau6r8r9w/u4xLn9wLTBy6OstavKx8O716LS4rrzw+a1xLLOyv3A4NDNyseyu82stcSjrL3hufu+zbGvvufBy6GjPC9wPgo8cD4gPC9wPgo8cD7I57n7yrnTw8HLIG92ZXJyaWRlILnYvPzX1qOs1eLW1rTtzvPKx7rcyN3S17Hcw+K1xKGjPC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">//MyWidget.h #ifndef MW_H #define MW_H #include class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = 0); ~MyWidget(); protected: void mousePressEvent( QMouseEvent * event ) override; void mouseReleaseEvent( QMouseEvent * event ) override; void mouseMoveEvent( QMoveEvent * event ) override; }; #endif

再次編譯,就會提示

‘void MyWidget::mouseMoveEvent( QMoveEvent * event )’marked override, but does not override

不過override 關鍵字需要編譯器支持 C++11。如果使用的是 gcc 編譯器,需要加入命令行參數 -std=c++11


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved