Skip to the content.

Допустим у нас есть класс 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 позволяет: