РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
681 of 815 menu

Ключевое слово final

Ключевое слово final применяется в C++ для запрета наследования от класса или для запрета переопределения виртуального метода в производном классе. Когда класс помечен как final, от него нельзя наследоваться. Когда метод помечен как final, его нельзя переопределить в классах-наследниках. Ключевое слово final указывается после имени класса или после сигнатуры метода.

Синтаксис

// Запрет наследования от класса class ClassName final { // тело класса }; // Запрет переопределения метода class ClassName { virtual ReturnType methodName() final; };

Пример

Давайте создадим класс Base с виртуальным методом show, помеченным как final, и попробуем переопределить его в производном классе:

#include <iostream> using namespace std; class Base { public: virtual void show() final { cout << "Base" << endl; } }; class Derived : public Base { public: void show() override { cout << "Derived" << endl; } }; int main() { Derived d; d.show(); return 0; }

Результат выполнения кода:

error: virtual function 'virtual void Derived::show()' overriding final function

Компилятор выдаст ошибку, так как метод show помечен как final и не может быть переопределён.

Пример

Давайте создадим класс Base, помеченный как final, и попробуем унаследоваться от него:

#include <iostream> using namespace std; class Base final { public: void show() { cout << "Base" << endl; } }; class Derived : public Base { public: void show() { cout << "Derived" << endl; } }; int main() { Derived d; d.show(); return 0; }

Результат выполнения кода:

error: cannot derive from 'final' base 'Base' in derived type 'Derived'

Компилятор выдаст ошибку, так как класс Base помечен как final и от него нельзя наследоваться.

Пример

Давайте создадим класс Base с виртуальным методом show, помеченным как final, и производный класс Derived, который не переопределяет этот метод, а использует его:

#include <iostream> using namespace std; class Base { public: virtual void show() final { cout << "Base" << endl; } }; class Derived : public Base { public: void print() { cout << "Derived" << endl; } }; int main() { Derived d; d.show(); d.print(); return 0; }

Результат выполнения кода:

"Base" "Derived"

Код успешно компилируется, так как метод show не переопределяется в классе Derived.

Смотрите также

  • ключевое слово virtual,
    которое объявляет виртуальный метод
  • ключевое слово override,
    которое указывает на переопределение метода
  • ключевое слово наследование,
    которое позволяет создавать производные классы
  • ключевое слово абстрактный класс,
    который содержит чисто виртуальные методы
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить