Допустим у нас есть класс Base, который содержит три виртуальных метода, в классе Derived мы переопределяем эти методы:
struct Base
{
virtual void update();
virtual void foo(int);
virtual void bar() const;
};
struct Derived : Base
{
virtual void update() override; // OK
virtual void updata() override; // ERROR (updata)
virtual void foo(float) override; // ERROR (float)
virtual void foo(int) override; // OK
virtual int foo(int) override; // ERROR (int)
virtual void foo(int) override; // OK
virtual int foo(int) const override; // ERROR (const)
virtual void foo(int) override; // OK
virtual void bar(long); // новый виртуальный метод класса Derived, проверки не будет
virtual void bar() const final; // переопределили и запретили переопределять производным классам
};
struct Derived2 final : Derived // запрет на наследование от Derived2
{
virtual void bar() const; // error
};
struct Derived3 : Derived2 // error
{
};
Если мы укажем ключевое слово override при переопределении, то компилятор проверит, действительно ли есть в родительском классе метод с такой сигнатурой, соответственно если мы ошиблись, то компилятор сообщит об ошибке.
Ключевое слово final позволяет:
- запретить переопределять виртуальный метод в производных классах
- запретить наследоваться от класса