Я начинаю на С++. Я встретил ключевое слово 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!");
}