Является ли мой анализ правильным? Включает ли функциональность final без виртуальной функции функцию override?
Нет. Причина, по которой это была ошибка компилятора:
void prynt() final; // Error: Hooray, compiler found my typo
Это потому, что final
разрешено только для виртуальных функций. Компилятор жалуется, потому что вы использовали его в функции, которая не является виртуальной.
Нет ничего синтаксически неправильного в этой строке:
virtual void prynt() final; // Oops: typo, but compiler-ok
Это может быть не то, что вы хотите, но это законный (и даже значимый, в зависимости от обстоятельств) код.
Проблема, с которой вы сталкиваетесь, связана с желанием сделать это:
struct Driver {
virtual void print();
};
struct MouseDriver : public Driver {
void print();
};
Исключение virtual
технически законно. Но лично я всегда чувствовал, что это дурной тон. Вы помещаете жизненно важную информацию (какие функции переопределяются) в другой класс. Я думаю, что было ошибкой даже позволять это компилировать.
Если вы хотите избежать этой проблемы, явно укажите virtual
для всех виртуальных функций и используйте override
в местах, где вы хотите создать новую функцию. Тогда это не будет правильно скомпилировано.
struct Driver {
virtual void print();
};
struct MouseDriver : public Driver {
virtual void print() override;
};