Для чего используется ключевое слово "override" в C++? [дубликат]

этот вопрос уже есть ответ здесь:

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

4 ответов


на override ключевое слово служит двум целям:

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

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

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, в лучшем случае компилятор выдаст предупреждение для "Вы скрываете виртуальный метод с тем же именем".


и как дополнение ко всем отвечает, FYI:override не является ключевым словом, но a специальные тип идентификатора! Он имеет значение только в контексте объявления / определения виртуальных функций, в других контекстах это просто порядковый номер идентификатор. Подробности читать 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;
}

выход:

zaufi@gentop /work/tests $ g++ -std=c++11 -o override-test override-test.cc
zaufi@gentop /work/tests $ ./override-test
virtual void derived::foo()

override является ключевым словом C++11, что означает, что метод является "переопределением" метода из базового класса. Рассмотрим следующий пример:

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

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

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


в Википедии написано:

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

подробно, когда у вас есть объект 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!");
}