在C++11中为了帮助程序猿写继承结构复杂的类型,引入了虚函数描写叙述符override,假设派生类在虚函数声明时使用了override描写叙述符,那么该函数必须重载其基类中的同名函数,否则代码将无法通过编译。我们来看一下如代码清单2-25所看到的的这个简单的样例。

代码清单2-25

struct Base {

    virtual void Turing() = 0;

    virtual void Dijkstra() = 0;

    virtual void VNeumann(int g) = 0;

    virtual void DKnuth() const;

    void Print();

};

struct DerivedMid: public Base {

    // void VNeumann(double g);

    // 接口被隔离了,曾想多一个版本号的VNeumann函数

};

struct DerivedTop : public DerivedMid {

    void Turing() override;

    void Dikjstra() override;           // 无法通过编译,拼写错误,并不是重载

    void VNeumann(double g) override;   // 无法通过编译,參数不一致,并不是重载

    void DKnuth() override;             // 无法通过编译,常量性不一致,并不是重载

    void Print() override;              // 无法通过编译,非虚函数重载

};

// 编译选项:g++ -c -std=c++11 2-10-3.cpp

在代码清单2-25中,我们在基类Base中定义了一些virtual的函数(接口)以及一个非virtual的函数Print。其派生类DerivedMid中,基类的Base的接口都没有重载,只是通过凝视能够发现,DerivedMid的作者以前想要重载出一个“void VNeumann(double g)”的版本号。这行凝视显然迷惑了编写DerivedTop的程序猿,所以DerivedTop的作者在重载全部Base类的接口的时候,犯下了3种不同的错误:

函数名拼写错,Dijkstra误写作了Dikjstra。

函数原型不匹配,VNeumann函数的參数类型误做了double类型,而DKnuth的常量性在派生类中被取消了。

重写了非虚函数Print。

假设没有override修饰符,在代码清单2-25中,DerivedTop作者的4处能够编译过去 可是与他的愿意(想重载虚函数)有严重的偏差了 可是编译器不报错,继续编译下去 这样就难排查了。加上keywordoverride
这样编译器能够辅助检查是不是正确重载 。
假设没有override修饰符 DerivedTop的作者可能在编译后都没有意识到自己犯了这么多错误。由于编译器对以上3种错误不会有不论什么的警示。这里override修饰符则能够保证编译器辅助地做一些检查。我们能够看到,在代码清单2-25中,DerivedTop作者的4处错误都无法通过编译。

此外,值得指出的是,在C++中,假设一个派生类的编写者自觉得新写了一个接口,而实际上却重载了一个底层的接口(一些简单的名字如get、set、print就easy出现这种状况),出现这种情况编译器还是爱莫能助的。只是这样无意中的重载一般不会带来太大的问题,由于派生类的变量假设调用了该接口,除了可能存在的一些虚函数开销外,仍然会运行派生类的版本号。因此编译器也就没有必要提供检查“非重载”的状况。而检查“一定重载”的overridekeyword,对程序猿的实际应用则会更有意义。

还有值得注意的是,如我们在第1章中提到的,final/override也可以定义为正常变量名,仅仅有在其出如今函数后时才是可以控制继承/派生的keyword。通过这种设计,非常多含有final/override变量或者函数名的C++98代码就行被C++编译器编译通过了。但出于安全考虑,建议读者在C++11代码中应该尽可能地避免这种变量名称或将其定义在宏中,以防发生不必要的错误。

建议:假设派生类里面是像重载虚函数 就加上keywordoverride 这样编译器能够辅助检查是不是正确重载,假设没加这个keyword 也没什么严重的error 仅仅是少了编译器检查的安全性

【c++】虚函数描写叙述符override的更多相关文章

  1. linux c 通过文件描写叙述符获取文件名称

    在linux中每一个被打开的文件都会在/proc/self/fd/文件夹中有记录,当中(/proc/self/fd/文件描写叙述符号:这个文件是符号文件)的文件就是文件描写叙述符所相应的文件. 而re ...

  2. 进程与进程描写叙述符(task_struct)

    一. 进程 进程(Process) 计算机中的程序关于某数据集合上的一次执行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体: ...

  3. Shell下的通配符、特殊符号和文件描写叙述符

    一:通配符 * 代表『 0 个到无穷多个』随意字符 演示样例:找出 /etc/ 底下以 cron 为开头的文件名称的文件 [root@instructor Desktop]# ls /etc/cron ...

  4. Python描写叙述符(descriptor)解密

    Python中包括了很多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些" ...

  5. 每天进步一点点——Linux中的文件描写叙述符与打开文件之间的关系

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆能够看成是文件,文件又可分为:普通 ...

  6. openssl之BIO系列之12---文件描写叙述符(fd)类型BIO

    文件描写叙述符(fd)类型BIO ---依据openssl doc\crypto\bio_s_fd.pod翻译和自己的理解写成 (作者:DragonKing Mailwzhah@263.net 公布于 ...

  7. Linux 文件描写叙述符设置为非堵塞的方法

    通过fcntl设置文件描写叙述符属性 fcntl即F_SETFL,F_GETFL的使用,设置文件的flags,堵塞设置成非堵塞,非堵塞设置成堵塞(这连个在server开发中能够封装为基本函数) 1.获 ...

  8. C API函数描写叙述(S-W)

    25.2.3.59. mysql_select_db() int mysql_select_db(MYSQL *mysql, const char *db) 描写叙述 使由db指定的数据库成为由mys ...

  9. ORA-12514: TNS: 监听程序当前无法识别连接描写叙述符中请求的服务

    不指定数据库能够正常连接: 指定数据库和使用PL/SQL Developer都出现错误: 在此说明一下我的环境:Oralce装的是64位的在使用PL/SQL Developer时曾出现过初始化错误,解 ...

随机推荐

  1. JavaFX 开发是遇到一些问题记录

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "PingFang SC"; color: #000000; min-he ...

  2. iOS面试题16719-b

    1. 反转二叉树,不用递归 /*** Definition for a binary tree node.* public class TreeNode {*     int val;*     Tr ...

  3. Java多线程初学者指南(8):从线程返回数据的两种方法

    从线程中返回数据和向线程传递数据类似.也可以通过类成员以及回调函数来返回数据.但类成员在返回数据和传递数据时有一些区别,下面让我们来看看它们区别在哪. 一.通过类变量和方法返回数据 使用这种方法返回数 ...

  4. hdu 4722

    比赛的时候这道题一直都没出来,承启提醒我之后还是一直WA: 其实规律早就找到了```` 其实这题还可以用数位dp来做,不过从来没写过,以后再贴: 代码: #include<iostream> ...

  5. 【UVA 11354】 Bond (最小瓶颈生成树、树上倍增)

    [题意] n个点m条边的图 q次询问 找到一条从s到t的一条边 使所有边的最大危险系数最小 InputThere will be at most 5 cases in the input file.T ...

  6. TortoiseSVN下载,安装,配置,常用操作 svn教程

    一. 首先在百度搜索并下载 TortoiseSVN 推荐从官网下载,软件分为32位和64位版本,下载时请根据自己的系统位数进行下载:

  7. 如何在win下编译thunderbird

    最近突然想研究一下thunderbird的实现,于是在WIN2K3下对其进行了系列的编译,特将编译的一些心得与大家共享.其实编译过程已经非常简单了,本文以VC8 ( VISUAL STUDIO 200 ...

  8. STL set multiset map multimap unordered_set unordered_map example

    I decide to write to my blogs in English. When I meet something hard to depict, I'll add some Chines ...

  9. Android4.0 -- UI控件之 Menu 菜单的的使用(一)

      这一讲开始我们来讲一下Android中菜单的使用方法,菜单是应用中的普通的组件,主要是提供友好和专注的用户体验,你可以在你的Activity中使用 Menu APIs 来提供用户动作和其他选项的操 ...

  10. ManagerDay-1

    初做管理,没有任何管理经验的我,有点紧张,在来公司之前,脑子里一直在想能不能胜任这份工作. 想着能否做出合格的流程图,像样的需规.我该如何和组内开发人员打好交道.报价预算该如何做,这些都交织在脑内显得 ...