Какую пользу извлекает компилятор из нового ключевого слова C ++?

C ++ 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 со ссылкой на него. Просматривая некоторые дискуссии, я нашел аргументы со стороны C ++ / CLI, но нет четкого намека на то, почемуfinal может быть полезно для компилятора. Я думаю об этом, потому что я также вижу некоторые недостатки маркировки классаfinal: Для модульного тестирования защищенных функций-членов можно получить класс и вставить тест-код. Иногда эти классы являются хорошими кандидатами для отметкиfinal, Эта техника была бы невозможна в этих случаях.

Ответы на вопрос(3)

Ваш ответ на вопрос