【c++】虚函数描写叙述符override

【c++】虚函数描写叙述符override

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

在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 仅仅是少了编译器检查的安全性

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118960.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 大一c语言图书管理系统_C语言结构体类型名

    大一c语言图书管理系统_C语言结构体类型名图书管理系统1.前言在大一下,我们的C语言课程布置了一次大作业,要求做出一个管理系统,整个系统可以设计为数据插入模块、数据修改模块、数据删除模块、数据显示模块和数据查询模块。各种信息管理系统本质上是没有太大区别的,对于数据的操作都是差不多的。2.功能及其相关函数2.1菜单界面的构建建立两个界面函数,用来搭建主页,这里用到两个头文件#include<conio.h>定义了通过控制台的数据输入与输出函数#include<windows.h>用来调整方框大小与背景颜色

    2022年8月31日
    2
  • centos7系统更新命令_centos 更新

    centos7系统更新命令_centos 更新1.查看网络IP ifconfig2.下载命令 wget+网址3.安装 yum-y install + 目标4.删除文件 sudo rm 文件所在目录/目标强制删除文件 rm -f删除目录 rm -rf5.复制一个文件到另一个文件夹sudo cp /文件夹/文件 /另一个文件夹6.对一些文件进行读写sudo vim 文件名7….

    2022年8月19日
    12
  • 冯·诺依曼计算机特点[通俗易懂]

    冯·诺依曼计算机特点冯·诺依曼,20世纪最重要的数学家之一。在现代计算机、博弈论、核武器和生化武器等众多领域内有杰出建树的最伟大的科学全才之一,被后人称为“计算机之父”和“博弈论之父”。一、冯·诺依曼计算机结构二、冯·诺依曼计算机的特点计算机由五大部件组成:存储器,运算器,控制器,输入设备,输出设备。指令和数据以同等地位存于存储器,可按地址顺序访问。指令和数据用二进制表示。指令由操作码和地址码组成。存储程序,程序在计算机中顺序存放。以运算器为中心。(不合理:花大量的时间进行数据传输,降

    2022年4月12日
    95
  • 基于ZigBee和STM32的智能家居控制系统的设计与实现(五)–终结篇

    基于ZigBee和STM32的智能家居控制系统的设计与实现(五)–终结篇说明首先祝贺自己顺利的完成了毕业答辩工作,想起整个过程还是挺让自己感动的。最后还被评为优秀毕业设计,虽然并没有什么luan用,但是,马上毕业了,还是挺让人怀念的。整个资料从第一篇博客说起就说会全部开源的,期间承蒙各位朋友的支持,给与资助,在此感谢了。虽然资料中私人信息删除了一些,但是不免有疏漏,所以有关个人信息还挺各位删除掉,小

    2022年4月8日
    44
  • 背单词的方法

    背单词的方法

    2021年5月2日
    120
  • matlab pca分析(二次进化攻略)

    主成分分析主成分分析法(PCA)是一种高效处理多维数据的多元统计分析方法,将主成分分析用于多指标(变量)的综合评价较为普遍。该方法的基本思想是运用较少的变量去解释原始数据中的大部分变异,通过对原始数据相关矩阵内部结构关系的分析和计算,产生一系列互不相关的新变量。根据需要从中选取比原始变量个数少的几个新变量,这些新的变量就是所谓的主成分,它们能够充分解释原始数据的变化。因此,主成分分析法本质上是…

    2022年4月11日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号