在覆盖纯虚函数时使用`override`有什么意义吗?

R2B*_*2B2 45 c++ overriding pure-virtual c++11

例如:

class Base {
  virtual void my_function() = 0;
};

class Derived : Base {
  void my_function() override;
};
Run Code Online (Sandbox Code Playgroud)

从我读到的,override关键字用于确保我们在我们覆盖的函数中具有正确的签名,并且它似乎是它的唯一用途.

但是,在纯虚函数的情况下,如果我们在Derived类(或Base类中使用不正确的签名,取决于如何看待事物)中使用不正确的签名,编译器将抛出错误.那么,在声明override结束时添加是否有任何意义Derived::my_function()

Vit*_*meo 73

但是,在纯虚函数的情况下,如果我们在Derived类中使用了错误的签名,编译器将抛出错误

不,这编译:

class Base {
  virtual void my_function() = 0;
};

class Derived : Base {
  void my_function(int);
//                 ^^^ mistake!
};
Run Code Online (Sandbox Code Playgroud)

虽然这不是:

class Base {
  virtual void my_function() = 0;
};

class Derived : Base {
  void my_function(int) override;
};
Run Code Online (Sandbox Code Playgroud)

错误:已void Derived::my_function(int)标记override,但未覆盖


您正在谈论的错误仅在实例化时发生Derived- override允许您更早地捕获错误并使定义Derived更清晰/更可读.

  • "否"是对编译器抛出错误的说法的回应. (10认同)
  • 等等有点意思吗?你继续谈论它是如何有用的,但开始只是"不". (4认同)

das*_*ght 31

是的,使用override关键字作为防御性练习是个好主意.

Base决定的作者my_function不再是纯虚拟的时候考虑重新设计,并且它应该采用新的参数.随着override到位编译器将捕获这个问题; 没有override你的Derived班级将继续编译.


Jha*_*aat 7

是!!

它提高了代码清晰度: override关键字可以防止歧义并传达它覆盖其基类方法的含义.

防止可能的意外使用:将来,如果基类更改方法签名(此处virtual),则强制派生类相应地更改.(编译错误).否则(没有override关键字)可以考虑method overload,这不是预期的.