Для чего используется ключевое слово "override" в C++? [дубликат]
этот вопрос уже есть ответ здесь:
- является ли ключевое слово "override" просто проверкой для переопределенного виртуального метода? 4 ответы
Я новичок в C++. Я наткнулся override
ключевое слово, используемое в заголовочном файле, над которым я работаю. Могу ли я знать, что такое реальное использование override
, возможно, с примером это легко понять.
4 ответа:
The
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
, самое большее компилятор выдаст предупреждение для "Вы скрываете виртуальный метод с тем же именем".
и как дополнение ко всем отвечает, 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; }
выход:
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 ():
, вы можете распечатать " Hello Bar!"когда функция hello () вызывается из объекта bar. Вы можете сделать это с помощью переопределенияclass bar : foo { // no functions in here but yet, you can call // bar.hello() }
class bar : foo { virtual void hello() override; // Code : printf("Hello Bar!"); }