Для чего используется ключевое слово "override" в C++? [дубликат]
этот вопрос уже есть ответ здесь:
- является ли ключевое слово "override" просто проверкой переопределенного виртуального метода? 4 ответы
Я новичок в C++. Я наткнулся override
ключевое слово, используемое в заголовочном файле, над которым я работаю. Могу ли я знать, что такое настоящая польза override
, возможно, с примером легко понять.
4 ответов
на 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
не является ключевым словом, но 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!");
}