Ключевое слово 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,
которое указывает на переопределение метода -
ключевое слово
наследование,
которое позволяет создавать производные классы -
ключевое слово
абстрактный класс,
который содержит чисто виртуальные методы