С++ 11 позволит пометить классы и виртуальный метод, чтобы быть окончательным, чтобы запретить их получение или переопределить.
class Driver {
virtual void print() const;
};
class KeyboardDriver : public Driver {
void print(int) const final;
};
class MouseDriver final : public Driver {
void print(int) const;
};
class Data final {
int values_;
};
Это очень полезно, потому что он сообщает читателю интерфейса что-то о намерении использования этого класса/метода. То, что пользователь получает диагностику, если он пытается переопределить, также может оказаться полезным.
Но есть ли преимущество с точки зрения компиляторов? Может ли компилятор сделать что-то другое, когда он знает, что "этот класс никогда не будет получен" или "эта виртуальная функция никогда не будет переопределена"
Для final
я в основном нашел только N2751, ссылаясь на него. Просеивая некоторые из обсуждений, я нашел аргументы, исходящие из С++/CLI, но не ясно, почему final
может быть полезен для компилятора. Я думаю об этом, потому что я также вижу некоторые недостатки маркировки класса final
. Для модульных тестов защищенных функций-членов можно получить класс и вставить тестовый код. Иногда эти классы являются хорошими кандидатами для маркировки с помощью final
. Этот метод был бы невозможным в этих случаях.