描述:override保留字表示当前函数重写了基类的虚函数。

目的:
1.在函数比较多的情况下可以提示读者某个函数重写了基类虚函数(表示这个虚函数是从基类继承,不是派生类自己定义的);
2.强制编译器检查某个函数是否重写基类虚函数,如果没有则报错。

用法:在类的成员函数参数列表后面添加该关键字既可。

例子:
class Base {
virtual void f();
};

class Derived : public Base {
void f() override; // 表示派生类重写基类虚函数f
void F() override;//错误:函数F没有重写基类任何虚函数
};

注意:override只是C++保留字,不是关键字,这意味着只有在正确的使用位置,oerride才启“关键字”的作用,其他地方可以作为标志符(如:int override;是合法的)。

相关:override还有一个姊妹保留字final。

VC++编译器支持情况: VS2008,VS2010,VS2012,VS2013,+

注: override为标准C++保留字,并非VS特有,目前主流的编译器的新版本都支持该保留字。

C++ 语言标准这些年进化的很快,许多新引入的特性我都没有用过。说实话自己也比较懒,总是觉得自己对C++ 的掌握程度已经足够应付日常的各种项目了,所以没有学习新特性的动力。而且一直觉得新引入的特性多数都属于那种“语法糖”,能够发挥的作用不大,其实是可有可无的。

不过最近编写一个小程序时代码里有个小bug,困扰了我好几天。最后在几个热心网友的帮助下才解决了。这个小bug让我认识到C++11 中提供的override 关键字非常有用,下面就简单的说说我代码中的那个小bug。

我的那个代码是个利用Qt 写的GUI程序,程序中需要响应鼠标的mouseMoveEvent 事件。但是结果怎么也接收不到这个事件。下面是我的程序的一个简化版本。

[cpp] view plain copy
//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

[cpp] view plain copy
//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”;
}

[cpp] view plain copy
//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 );

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

void moveEvent( QMoveEvent * event );

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

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

[cpp] view plain copy
//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

如果是用qt的话,要在pro文件中增加如下内容:

QMAKE_CXXFLAGS += “-std=c++11”

c++中 override用法相关推荐

  1. Android中list常用方法,Android中ListActivity用法实例分析

    本文实例分析了Android中ListActivity用法.分享给大家供大家参考,具体如下: 程序如下: import android.app.ListActivity; import android ...

  2. java的collect用法_java8新特性:stream流中collect用法

    java8新特性:stream流中collect用法 java8新特性:stream流中collect用法 1.toList List collectList = Stream.of(1, 2, 3, ...

  3. android中view用法,Android中ImageView用法实例分析

    本文实例分析了Android中ImageView用法.分享给大家供大家参考,具体如下: 猜牌游戏大家可能以前都玩过,这里我们用这个小游戏来说明ImageView的用法. 首先,在res/drawabl ...

  4. android notification 的总结分析,Android中Notification用法实例总结

    本文实例总结了 Android中Notification用法.分享给大家供大家参考,具体如下: 我们在用手机的时候,如果来了短信,而我们没有点击查看的话,是不是在手机的最上边的状态栏里有一个短信的小图 ...

  5. android listview 分析,Android中ListView用法实例分析

    本文实例分析了Android中ListView用法.分享给大家供大家参考,具体如下: 通过在Layout中添加ListView Widget可以达到在页面布局具有列表效果的交互页面.在这里通过举例来说 ...

  6. android surface编程,Android中SurfaceView用法简单实例

    本文实例讲述了Android中SurfaceView用法.分享给大家供大家参考,具体如下: 这里贴上一个小程序代码,主要运用SurfaceView来实现在屏幕上画一个圆,你可以通过按方向键和触摸屏幕来 ...

  7. android 动态contextmenu,Android中ContextMenu用法实例

    本文实例讲述了Android中ContextMenu用法.分享给大家供大家参考.具体如下: main.xml文件如下: Android:orientation="vertical" ...

  8. c++中static_cast用法与uchar/char的区别

    1.c++中static_cast用法 static_cast是指显性类型强制转换,如: int a = static_cast<int>(120.34); 结果为a= 120. 和C语言 ...

  9. C++11中override的使用

    override是C++11中的一个继承控制关键字.override确保在派生类中声明的重载函数跟基类的虚函数有相同的声明. override明确地表示一个函数是对基类中一个虚函数的重载.更重要的是, ...

最新文章

  1. 自动化运维工具puppet(1)
  2. Factory模式与Prototype模式的异同
  3. Android stadio 关联源码
  4. Vi编辑器的使用方法
  5. USACO Section 4.2 题解
  6. Hadoop HIVE
  7. HDU 3966 Aragorn's Story (树链点权剖分,成段修改单点查询)
  8. php网页表格样式,HTML5制作表格样式
  9. MySQL 面试题汇总
  10. 信息学奥数一本通(1170:计算2的N次方)
  11. c语言 怎么访问64位地址_大神用10000字总结了嵌入式C语言必学知识点……
  12. Mysql对数据库操作的简单命令
  13. EDUCoder编程练习题解(一维数组和二维数组)
  14. ssh 认证指定端口
  15. AO*算法详解,附例子和算法详细步骤
  16. 递归算法经典实例python-Python实现经典递归算法
  17. 怎样设定计算机屏幕锁定时间,电脑怎么调锁屏时间
  18. Java生成解析一维码二维码
  19. 干货深挖!从写简历,到面试、谈薪酬的那些技巧和防坑指南
  20. AnimationEvent 'XXX' has no receiver!

热门文章

  1. 2018年世界杯德国输给韩国?终于找到原因了
  2. vue使用qrcodejs2生成带log的二维码图片,vue生成二维码图片中间带log,自定义log
  3. 中科院卜东波算法课第三题作业(dp)oj总结
  4. ABAddressBook
  5. PHP实现二度人脉算法
  6. PPT 图片重新着色 如何自定义颜色类型
  7. 和平精英如何在电脑上玩 和平精英模拟器玩法教程
  8. excel 只读或服务器没响应,Excel打开时显示只读或服务器没响应而打不开怎么办.doc...
  9. 这是python官方推荐的最好书籍
  10. xen虚拟机配置文件c_统一Xen DomU配置文件