# V1052. Declaring virtual methods in a class marked as 'final' is pointless.

Анализатор обнаружил присутствие виртуального метода в классе, помеченном как 'final'.

После рефакторинга или вследствие ошибочного проектирования класса могло получиться так, что класс был объявлен как завершенный ('final'), но при этом в него были добавлены непереопределенные виртуальные методы.

Такая структура класса не имеет смысла, и стоит проверить, не была ли нарушена логика наследования самого класса. Кроме этого, создание такого класса может приводить к хранению лишнего указателя на виртуальную таблицу методов и падению производительности.

Анализатор выдаст предупреждение для следующего класса:

    struct Cl final // <= V1052
    {
      virtual ~Cl() {}
    };

    struct BaseClass
    {
      virtual void foo(int);
    };

    struct DerivedClass final : BaseClass // <= V1052
    {
      virtual void bar(float);
    };

Если виртуальный метод / деструктор завершенного класса переопределяет виртуальный метод / деструктор базового класса, предупреждение выдано не будет:

    struct BaseClass
    {
      virtual void foo();
      virtual ~BaseClass();
    };

    struct DerivedClass final : BaseClass // ok
    {
      virtual void foo() override;
      virtual ~DerivedClass();
    };