В дополнение к сказанному Story Teller, рассмотрим причину для введения final
: она должна помочь оптимизации.
Когда класс final
, и у вас естьПо указанию, компилятор может доказать , какую функцию-член вы вызываете, даже если это virtual
.Если класс не является final
, указатель может фактически быть указателем на некоторый производный класс, который может переопределить метод virtual
, вызывая полный динамический поиск в vtable.
Независимо от того, является ли наследование private
или нет, всегда можно создать указатель базового класса.В случае наследования private
создание этого указателя базового класса будет ограничено производным классом, производным классом и любой базой производного класса, который все еще содержит больше кода, чем у оптимизатора для его создания.решения.Таким образом, только запрещение all наследования позволяет выполнять оптимизацию виртуального вызова.