覆盖纯虚函数时,有没有使用`override`的意思?

例如:

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

从我所读到的, override关键字被用来确保我们在正在被覆盖的函数中有正确的签名,并且它似乎是它唯一的用法。

但是,在纯虚函数的情况下,如果我们在Derived类(或者Base类,依赖于如何看待事物)中使用了不正确的签名,那么编译器会抛出一个错误。 那么,在Derived::my_function()声明的末尾添加override是否有任何意义?

但是,在纯虚函数的情况下,如果我们在Derived类中使用了不正确的签名,那么编译器会抛出一个错误

不,这个编译:

 class Base { virtual void my_function() = 0; }; class Derived : Base { void my_function(int); // ^^^ mistake! }; 

虽然这不:

 class Base { virtual void my_function() = 0; }; class Derived : Base { void my_function(int) override; }; 

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


你所说的错误只发生在实例化Derivedoverride允许你更早地发现错误,并使Derived更清晰/更具可读性的定义。

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

Base的作者决定my_function不再是一个纯虚拟的时候,考虑一个重新devise,并且它应该带一个新的参数。 编译器会override这个问题; 没有override您的Derived类将继续编译。

是!

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

防止可能的非预期用法 :将来,如果基类改变方法签名(这里是virtual ),它强制派生类相应地改变。 (与编译器错误)。 否则(没有override关键字)可能会被视为method overload ,这不是预期的。

通常不会因为override而烦恼,只是在周围移动一个错误。 我find了更好地获取错误的位置 – 在定义无法覆盖的方法的地方,而不是实例化类时。

但是,有一种方法可以防止运行时错误。

 struct Base { virtual void foo(int x = 0) = 0; void foo(double d) { foo( (int)d ); } }; inline void Base::foo(int x) { std::cout << "Default foo(" << x << ")\n"; } struct Derived:Base { using Base::foo; virtual void foo() { // oops, no int! std::cout << "Derived::foo()\n"; Base::foo(); } }; struct Derived2:Derived { virtual void foo(int x=0) override { std::cout << "Derived2::foo()\n"; Derived::foo(x); } }; 

在这里我们打算让每个foo调用它的父项foo 。 但是因为Derived::foo不会覆盖与Base::foo相同的签名,所以不会被调用。

Derived foo()之后添加override ,我们得到一个编译时错误。

是的,我实现了纯虚函数Base::foo