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