Ключевое слово override
Ключевое слово override применяется при объявлении
виртуального метода в производном классе. Оно сообщает
компилятору, что данный метод должен переопределять
виртуальный метод с такой же сигнатурой в базовом классе.
Если сигнатуры не совпадают или в базовом классе нет
соответствующего виртуального метода, компилятор выдаст
ошибку. Это помогает избежать трудноуловимых ошибок,
связанных с опечатками в имени метода или неверными
параметрами. Ключевое слово override ставится
после списка параметров метода, перед телом метода или
чисто виртуальным объявлением.
Синтаксис
virtual return_type method_name(parameters) override;
virtual return_type method_name(parameters) override { /* тело */ }
Пример
Давайте создадим базовый класс Animal с виртуальным
методом sound и производный класс Dog,
который переопределяет этот метод с помощью ключевого
слова override:
#include <iostream>
using namespace std;
class Animal
{
public:
virtual void sound()
{
cout << "Some sound" << endl;
}
};
class Dog : public Animal
{
public:
void sound() override
{
cout << "Woof" << endl;
}
};
int main()
{
Dog dog;
dog.sound();
return 0;
}
Результат выполнения кода:
"Woof"
Пример
Если в производном классе случайно указать неверную
сигнатуру метода и при этом использовать override,
компилятор сообщит об ошибке. Давайте попробуем
переопределить метод sound с параметром, которого
нет в базовом классе:
#include <iostream>
using namespace std;
class Animal
{
public:
virtual void sound()
{
cout << "Some sound" << endl;
}
};
class Dog : public Animal
{
public:
// Ошибка компиляции: метод не переопределяет
// виртуальный метод базового класса
void sound(int volume) override
{
cout << "Woof " << volume << endl;
}
};
int main()
{
Dog dog;
dog.sound(5);
return 0;
}
Компилятор выдаст ошибку, потому что метод
sound с параметром int не переопределяет
виртуальный метод sound без параметров из класса
Animal.
Пример
Давайте рассмотрим корректное переопределение
виртуального метода с параметрами. Создадим базовый
класс Shape с виртуальным методом area,
принимающим один параметр, и производный класс
Rectangle:
#include <iostream>
using namespace std;
class Shape
{
public:
virtual int area(int factor)
{
return factor;
}
};
class Rectangle : public Shape
{
public:
int area(int factor) override
{
return factor * 2;
}
};
int main()
{
Rectangle rect;
cout << rect.area(5) << endl;
return 0;
}
Результат выполнения кода:
10
Смотрите также
-
ключевое слово
virtual,
которое объявляет виртуальный метод -
ключевое слово
final,
которое запрещает переопределение метода -
ключевое слово
pure-virtual,
которое создает чисто виртуальный метод -
раздел
inheritance,
который описывает наследование классов