虚拟?重写?或两者? C ++

时间:2016-10-08 12:32:41

标签: c++ c++11

在过去的几周里,有些事情让我的大脑陷入虚拟和超越的境地。 我已经了解到,当你使用虚函数进行继承时,你必须添加virtual以让编译器知道搜索正确的函数。 之后我还了解到在c ++ 11中有一个新关键字 - 覆盖。现在我有点困惑; 我是否需要在我的程序中同时使用虚拟和覆盖关键字,或者最好只使用其中一个?

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

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

最好的方法是什么?

1 个答案:

答案 0 :(得分:106)

当您覆盖某个功能时,技术上不需要写virtualoverride

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

在派生类中,通过将¹same类型作为基类函数,该函数是虚拟的。

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

以同样的方式,派生类中的virtual关键字可以通过确保函数在其他派生类中仍然是虚拟的来使这样的错误更加微妙。

所以一般的建议是,

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

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

示例:

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

注意:
¹C++支持协变原始指针和原始参考结果。对于协方差,覆盖的类型不完全相同。它只是一个兼容的类型。 功能