首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该使用虚拟的、覆盖的,还是同时使用两个关键字?

我应该使用虚拟的、覆盖的,还是同时使用两个关键字?
EN

Stack Overflow用户
提问于 2016-10-08 12:32:40
回答 1查看 135K关注 0票数 187

在过去的几周里,有件事困扰着我关于virtualoverride的事情。我已经了解到,当您使用虚拟函数进行继承时,必须添加virtual以让编译器知道如何搜索正确的函数。之后,我还了解到在c++ 11中有一个新的关键字- override。现在我有点困惑;,我需要在我的程序中同时使用虚拟关键字和覆盖关键字,还是最好只使用其中的一个?

为了解释我自己-代码例子我的意思是:

代码语言:javascript
复制
class Base
{
public:
    virtual void print() const = 0;
    virtual void printthat() const = 0;
    virtual void printit() const = 0;
};

class inhert : public Base
{
public:
    // only virtual keyword for overriding.
    virtual void print() const {}

    // only override keyword for overriding.
    void printthat() const override {}

    // using both virtual and override keywords for overriding.
    virtual void printit() const override {}
};

什么是最好的方法?

EN

回答 1

Stack Overflow用户

发布于 2021-11-11 17:46:11

根据C++核心指南C.128,每个虚函数声明都应该指定,即virtualoverridefinal的一个

  • virtual:用于基类中函数的“第一次”外观
  • override:用于重写从某个基类派生的类中的virtual函数,该类提供具有相同(或协变)签名的virtual函数
  • unoverrideable.:用于将覆盖标记为final也就是说,具有final虚拟函数覆盖的类的派生项不能被重写该虚拟函数覆盖。
代码语言:javascript
复制
struct A {
    virtual void go() { puts("A"); }
};
struct B : A {
    // Overrides A::go(). No need to specify `virtual` explicitly,
    // it already implicitly is virtual and overrideable
    void go() override { puts("B"); }
};
struct C : B {
    void go() final { puts("C"); }
    //virtual void go() override final { puts("C"); } would still compile,
    // but it is considered, for lack of a better description, "extra"
};
struct D : C {
    // Would produce error C3248 : 'C::go' : function declared as 'final' cannot be overridden by 'D::go'
    //void go() override { puts("D"); }
};
票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39932391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档