Добавлена поддержка модификаторов final и override для классов, структур и функций.
Модификатор final для классов и структур
Наличие
модификатора final при объявлении структуры или класса запрещает
дальнейшее наследование от него. Если класс (структура) таков, что нет
необходимости вносить в него дальнейшие изменения, или изменения
недопустимы по соображениям безопасности, объявите его с модификатором
final. При этом все методы класса будут также неявно считаться final.
class CFoo final
{
};
class CBar : public CFoo
{
};
При попытке наследования от класса с модификатором final, как показано в примере выше, компилятор выдаст ошибку:cannot inherit from 'CFoo' as it has been declared as 'final'
see declaration of 'CFoo'
Модификатор override для функций
Модификатор
override означает, что объявляемая функция обязательно должна
переопределить метод родительского класса. Использование этого
модификатора позволяет избежать ошибок при переопределении, таких как
случайное изменение сигнатуры метода. Например, в базовом классе
определен метод func, принимающий в качестве аргумента переменную типа
int:
class CFoo
{
void virtual func(int x) const { }
};
Далее метод переопределяется в наследуемом классе:
class CBar : public CFoo
{
void func(short x) { }
};
Но по ошибке тип аргумента изменяется с int на short.
Фактически, в этом случае уже происходит не переопределение, а перегрузка метода. Действуя в соответствии с алгоритмом определения перегруженной функции, в определенных ситуациях компилятор может выбрать метод, определенный в базовом классе, вместо переопределенного метода.
Чтобы избежать подобных ошибок, к переопределяемому методу следует явно добавлять модификатор override.
class CBar : public CFoo
{
void func(short x) override { }
};
Если при переопределении будет изменена сигнатура метода, компилятор не
сможет найти в родительском классе метод с точной такой же
сигнатурой и выдаст ошибку компиляции:'CBar::func' method is declared with 'override' specifier but does not override any base class method
Модификатор final для функций
Модификатор
final действует наоборот — он запрещает переопределение метода в
классах-наследниках. Если реализация метода самодостаточна и полностью
завершена, объявите его с модификатором final, чтобы он гарантированно
не был изменен в последующем.
class CFoo
{
void virtual func(int x) final { }
};
class CBar : public CFoo
{
void func(int) { }
};
При попытке переопределения метода с модификатором final, как показано в примере выше, компилятор выдаст ошибку:'CFoo::func' method declared as 'final' cannot be overridden by 'CBar::func'
see declaration of 'CFoo::func'