Что такое ключевое слово override в С++?

Я начинаю на С++. Я встретил ключевое слово override, которое используется в файле заголовка, над которым я работаю. Могу ли я узнать, что реально использовать override, возможно, с примером было бы легко понять.

Ответ 1

Ключевое слово override выполняет две цели:

  • Он показывает читателю кода, что "это виртуальный метод, который переопределяет виртуальный метод базового класса".
  • Компилятор также знает, что он переопределен, поэтому он может "проверять", что вы не изменяете/добавляете новые методы, которые, по вашему мнению, переопределяют.

Чтобы объяснить последнее:

class base
{
  public:
    virtual int foo(float x) = 0; 
};


class derived: public base
{
   public:
     int foo(float x) override { ... do stuff with x and such ... }
}

class derived2: public base
{
   public:
     int foo(int x) override { ... } 
};

В derived2 компилятор выдаст ошибку для "изменения типа". Без override, самое большее компилятор даст предупреждение для "вы скрываете виртуальный метод с тем же именем".

Ответ 2

и как добавление ко всем ответам, FYI: override не является ключевым словом, а особым типом идентификатора! Это имеет смысл только в контексте объявления/определения виртуальных функций, в других контекстах это просто порядковый идентификатор. Подробнее см. 2.11.2 Стандарта.

// kate: hl C++11;
#include <iostream>

struct base
{
    virtual void foo() = 0;
};

struct derived : base
{
    virtual void foo() override
    {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
};

int main()
{
    base* override = new derived();
    override->foo();
    return 0;
}

Вывод:

[email protected] /work/tests $ g++ -std=c++11 -o override-test override-test.cc
[email protected] /work/tests $ ./override-test
virtual void derived::foo()

Ответ 3

override - это ключевое слово С++ 11, что означает, что метод является "переопределением" метода из базового класса. Рассмотрим этот пример:

   class Foo
   {
   public:
        virtual void func1();
   }

   class Bar : public Foo
   {
   public:
        void func1() override;
   }

Если знак B:: func1() не равен значению A:: func1(), ошибка компиляции будет сгенерирована, потому что B:: func1() не переопределяет A:: func1(), он определит новую вместо метода func1().

Ответ 4

Википедия говорит:

Переопределение метода в объектно-ориентированном программировании является языковой функцией, которая позволяет подклассу или дочернему классу предоставлять конкретную реализацию метода, который уже предоставляется одним из его суперклассов или родительских классов.

Подробно, когда у вас есть объект foo, у которого есть функция void hello():

class foo {
    virtual void hello(); // Code : printf("Hello!");
}

Ребенок foo также будет иметь функцию hello():

class bar : foo {
    // no functions in here but yet, you can call
    // bar.hello()
}

Однако вы можете распечатать "Hello Bar!". когда функция hello() вызывается из объекта bar. Вы можете сделать это с помощью переопределения

class bar : foo {
    virtual void hello() override; // Code : printf("Hello Bar!");
}