小编典典

我应该使用 virtual、override 还是同时使用这两个关键字?

all

在过去的几周里,一些事情让我的大脑一直在烦恼virtualoverride。我了解到,当您使用虚函数进行继承时,您必须添加virtual以让编译器知道搜索正确的函数。后来我还了解到,在
c++ 11 中有一个新的关键字 - override。现在我有点困惑; 我是否需要在我的程序中同时使用 virtual 和 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 {}
};

最好的方法是什么?


阅读 173

收藏
2022-08-17

共1个答案

小编典典

当您覆盖一个函数时,您在技术上不需要编写virtualoverride

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

在派生类中,函数是虚拟的,因为鹿的类型与基类函数相同。

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

同样,派生类中的virtual关键字可以通过确保该函数在进一步的派生类中仍然是虚拟的,从而使此类错误更加微妙。

所以一般的建议是,

  • 用于virtual基类函数声明。
    这在技术上是必要的。

  • (仅)用于override派生类的覆盖。
    这有助于维护。

例子:

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

注意:
鹿 C++ 支持协变原始指针和原始引用结果。使用协方差,覆盖的类型并不完全相同。它只是有一个兼容的类型。

2022-08-17