为什么要在C ++ 11中使用“override”说明符?

如果您知道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中的重写说明符是干净编码原则的一部分。它揭示了作者的意图,使代码更具可读性,并有助于在构建时识别错误。不用节制地使用它!


原文地址:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值