我应该使用virtual, override,还是两者都使用?

Should I use virtual, override, or both keywords?

本文关键字:两者都 override virtual 我应该      更新时间:2023-10-16

在过去的几周里,一些关于virtualoverride的事情一直困扰着我。我了解到,当你做继承与虚函数,你必须添加virtual,让编译器知道搜索正确的函数。后来我还了解到在c++ 11中有一个新的关键字——override。现在我有点困惑了;我是否需要在我的程序中同时使用虚拟和覆盖关键字,或者最好只使用其中一个?

解释我自己-我的意思的代码示例:

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 {}
};

最好的方法是什么?

当你重写一个函数时,技术上你不需要写virtualoverride

原始基类声明需要关键字virtual将其标记为virtual。

在派生类中,通过与基类函数具有相同的类型,函数是虚函数。

然而,override可以通过在预期的覆盖在技术上不是覆盖时产生编译错误来帮助避免错误。例如,函数类型与基类函数并不完全相同。或者基类的维护改变了函数的类型,例如添加默认实参。

以同样的方式,在派生类中使用virtual关键字可以确保该函数在进一步的派生类中仍然是虚函数,从而使这种错误变得更加微妙。

所以一般的建议是,
  • 使用virtual作为基类函数的声明。
    这在技术上是必要的。

  • 使用override(仅)用于派生类的重写。

的例子:

struct Base { virtual void foo() {} };
struct Derived: Base { void foo() override {} };

<一口>指出:
c++支持协变原始指针和原始引用结果。对于协方差,覆盖的类型并不完全相同。它只是有一个兼容的类型。

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

  • virtual: For "first"基类
  • 中函数的外观
  • override:对于从基类派生的类中提供相同(或协变)签名的virtual函数的virtual函数的重写
  • final:将重写标记为不可重写。也就是说,具有final虚函数覆盖的类的派生类不能重写该虚函数覆盖。
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"); }
};
相关文章: