Зачем добавлять final в функцию-член конечного класса?

Рассмотрим следующий код:

#include <iostream>

class B {
   virtual void f() {
      std::cout << "Base" << '\n';
   }
};

class D final: public Base {
   void f() final override {
      std::cout << "Derived" << '\n';
   }
};

Обращая внимание на два варианта использования контекстного ключевого слова final выше — доступно, начиная с C ++11 – мы можем наблюдать следующее:

  • Добавление final к функции-члену D f() предотвращает переопределение f() в классе, производном от D.
  • Добавление final к классу D препятствует его дальнейшему наследованию.

Поэтому невозможно, чтобы функция-член f() была переопределена классом, производным от D, поскольку такой производный класс не может существовать из-за final, примененного к классу D.

Есть ли смысл использовать final в качестве элемента управления переопределением для функции-члена virtual класса, объявленного как final? Или это просто лишнее?


person 眠りネロク    schedule 19.06.2019    source источник
comment
Это избыточно, но это также можно увидеть, например, при выполнении частного наследования, когда все члены становятся частными; У вас по-прежнему есть ключевое слово private для некоторых из них, но частное наследование заменяет все.   -  person Michael Chourdakis    schedule 19.06.2019
comment
Ознакомьтесь с stackoverflow. ком/вопросы/11704406/   -  person    schedule 19.06.2019
comment
Добавление final к классу D предотвращает его дальнейшее порождение. =› предотвращает переопределение (f) в классе, производном от D. Так что это, без сомнения, избыточно.   -  person Oliv    schedule 19.06.2019
comment
Мне кажется, что в данном случае это лишнее. Как избыточно (если я не ошибаюсь) использование override вместе с final.   -  person max66    schedule 19.06.2019
comment
@ max66, потому что final уже подразумевает, что функция-член должна быть virtual?   -  person 眠りネロク    schedule 19.06.2019
comment
потому что final уже подразумевает, что функция-член должна быть виртуальной? - Точно.   -  person max66    schedule 19.06.2019


Ответы (1)


final в функции virtual в производном классе final является избыточным.

Точно так же, как virtual в методе, отмеченном override, является избыточным. С++ просто иногда так.

person AndyG    schedule 19.06.2019