Поделиться через


Предупреждение C26435

Виртуальная функция "symbol" должна указывать именно одну из "virtual", "override" или "final" (c.128)

C++ Core Guidelines

C.128. Виртуальные функции должны указывать именно одну из виртуальных, переопределения или окончательных

Чтобы повысить удобочитаемость, необходимо четко указать тип виртуального поведения и без необходимости избыточности. Несмотря на то, что одновременно можно использовать несколько виртуальных описателей, лучше указать один раз, чтобы подчеркнуть наиболее важный аспект виртуального поведения. Ниже приведен порядок важности:

  • обычная виртуальная функция;
  • виртуальная функция, которая явно переопределяет ее базу;
  • виртуальная функция, переопределяет ее базу и предоставляет окончательную реализацию в текущей цепочке наследования.

Примечания.

  • Это правило пропускает деструкторы, так как они имеют специальные правила относительно виртуальности.
  • Предупреждения отображаются в определениях функций, а не объявлениях. Это может быть запутано, так как определения не имеют виртуальных описателей, но предупреждение по-прежнему подходит.

Имя анализа кода: SINGLE_VIRTUAL_SPECIFICATION

Пример: избыточный описатель

class Ellipse : public Shape {
public:
    void Draw() override {
        //...
    }
};

class Circle : public Ellipse {
public:
    void Draw() override final { // C26435, only 'final' is necessary.
        //...
    }
    virtual void DrawCircumference() final { // C26435, should be neither 'virtual' nor 'final'.
        //...
    }
};

См. также

C.128. Виртуальные функции должны указывать именно одну из виртуальных, переопределения или окончательных