如果您知道Java,那么您可能已经很熟悉Java了,这对您来说可能是完全简单的@Override annotation。如果您一直使用C / C ++进行编码,那么这可能是新的。您可能会问自己一个问题,为什么在不必要的时候为什么要放一个额外的说明符。您的代码将以相同的方式工作。
虽然在大多数情况下,代码的行为是不会改变的,但在其他情况下(实际上是在犯错误时),使用override会阻止您检查错误的代码,因为编译会失败。而且我们没有人检入甚至无法编译的代码,对吗?
该override说明符将告诉编译器和阅读器这两个函数实际上在使用其基类中的方法。
它告诉读者“这是一个虚拟方法,正在重写基类的虚拟方法。”
正确使用它,您将看不到任何效果:
class Base
{
virtual void foo();
};
class Derived : Base
{
void foo() override; // OK: Derived::foo overrides Base::foo
};
但这将帮助您揭示constness的问题:
class Base
{
virtual void foo();
void bar();
};
class Derived : Base
{
void foo() const override; // Error: Derived::foo does not override Base::foo
// It tries to override Base::foo const that doesn't exist```
};
我们不要忘记,在C ++中,默认情况下方法是非虚拟的。如果使用override,可能会发现没有要覆盖的内容。没有override指定者,我们只会创建一个全新的方法。没有更多的基本方法被忘记声明为虚拟方法。
class Base
{
void foo();
};
class Derived : Base
{
void foo() override; // Error: Base::foo is not virtual
};
我们还应该记住,当我们重写一个方法时,无论有没有override指定符,都无法进行转换:
class Base
{
public:
virtual long foo(long x) = 0;
};
class Derived: public Base
{
public:
long foo(int x) override { // error: 'long int Derived::foo(int)' marked override, but does not override
// ...
}
};
我认为,使用C ++ 11中的重写说明符是干净编码原则的一部分。它揭示了作者的意图,使代码更具可读性,并有助于在构建时识别错误。不用节制地使用它!
原文地址: