在过去的几周里,一些事情让我的大脑一直在烦恼virtual和override。我了解到,当您使用虚函数进行继承时,您必须添加virtual以让编译器知道搜索正确的函数。后来我还了解到,在 c++ 11 中有一个新的关键字 - override。现在我有点困惑; 我是否需要在我的程序中同时使用 virtual 和 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 {} };
最好的方法是什么?
当您覆盖一个函数时,您在技术上不需要编写virtual或override。
原始基类声明需要关键字virtual将其标记为虚拟。
在派生类中,函数是虚拟的,因为鹿的类型与基类函数相同。
但是,override当预期的覆盖在技术上不是覆盖时,可以通过产生编译错误来帮助避免错误。例如,函数类型与基类函数不完全一样。或者基类的维护改变了该函数的类型,例如添加一个默认参数。
同样,派生类中的virtual关键字可以通过确保该函数在进一步的派生类中仍然是虚拟的,从而使此类错误更加微妙。
所以一般的建议是,
用于virtual基类函数声明。 这在技术上是必要的。
(仅)用于override派生类的覆盖。 这有助于维护。
例子:
struct Base { virtual void foo() {} }; struct Derived: Base { void foo() override {} };
注意: 鹿 C++ 支持协变原始指针和原始引用结果。使用协方差,覆盖的类型并不完全相同。它只是有一个兼容的类型。