覆盖纯虚函数时,有没有使用`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
,但不覆盖
你所说的错误只发生在实例化Derived
– override
允许你更早地发现错误,并使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
。