【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)
上一篇 2021年11月28日 下午6:00
下一篇 2021年11月28日 下午7:00


相关推荐

  • 动态规划模型

    动态规划模型动态规划 1 中已经介绍了一些动态规划的一些基本内容 现在我们从三道题来看一下动态规划的模型 1 最大字段和给定一个由数字组成的序列 其中连续的一段子序列称为一个子段 子段中的所有数只和称为子段和 这里只考虑非空子段 即至少包含一个元素的子序列 那么现在需要你求出有一个序列中的最大子段和 当然我们可以用 o n 3 的暴力算法来解决这道题 也可以用前缀和优化成 o n 2 的算法来解决 但

    2026年3月19日
    2
  • IDEA优化内存配置,可提高启动和运行速度(亲测有效)「建议收藏」

    IDEA优化内存配置,可提高启动和运行速度(亲测有效)「建议收藏」一、优化IDEA配置IDEA默认启动配置主要考虑低配置用户,参数不高(默认最低128m,最高512m),导致启动慢,然后运行也不流畅,这里我们需要优化下启动和运行配置;但是在工作中的电脑一般都是8G或者16G的运行内存,所以我们需要手动去修改默认的IDEA配置。二、手动修改IDEA配置步骤找到IDEA安装的bin目录打开idea.exe.vmoptions文件关键的三个参…

    2022年5月20日
    722
  • Android 学习路线

    Android 学习路线1 性能 内存调优 2 JNI 和 NDK3 插件化 热修复 组件化 4 算法和数据结构 5 js 与本地交互 6 Socket 通信 TCP IP 和 HTTP7 自定义控件 8 音 视频 9 OKHttp Retrofit RxJava Gson10 服务 线程 aidl 进程的通信机制

    2026年3月17日
    3
  • Python:将列表转为字符串的3种方法「建议收藏」

    Python:将列表转为字符串的3种方法「建议收藏」#一天一个Python小技巧#将列表转为字符串:1、使用for循环testlist=[‘h’,’e’,’l’,’l’,’o’]teststr=”foriintestlist:teststr+=iprint(teststr)2、join方法:testlist=[‘h’,’e’,’l’,’l’,’o’]teststr=””.join(testlist)print(teststr)3、reduce方法:fromfunctools

    2022年5月9日
    58
  • BLOB类型转换成字符串类型

    BLOB类型转换成字符串类型BLOB 类型转换成字符串类型 blob to varchar2 一开始遇到这个问题的时候我走错了方向 一直没有解决 后来再网上找到了一个函数 亲测有效 blob to varchar2Crea To Varchar Blob InInBlob ReturnVarcha VarcharVarch 400

    2026年3月17日
    3
  • Letsencrypt简单教程调整

    Letsencrypt简单教程调整Letsencrypt 简单教程 一文较为详细地介绍了 Letsencrypt 的安装以及使用方法 然而 最近在一台服务器部署 letsencrypt 时 执行 letsencrypt auto 命令出现错误 letsencrypt autohelpallS autoisdeprec Yoursystemis autoanymore

    2026年1月25日
    2

发表回复

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

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