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


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

Функция "производный::function" скрывает не-виртуальную функцию base::function (c.128).

C++ Core Guidelines

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

Замечания

При вводе функции, которая имеет то же имя, что и не виртуальная функция в базовом классе, может возникнуть непредвиденное поведение. Это похоже на ввод имени переменной, конфликтующей с именем из внешней области. Например, может потребоваться переопределить функцию базового класса. Если подписи функций не совпадают, переопределение, предполагаемое переопределение может превратиться в перегрузку. Как правило, скрытие имен опасно и подвержено ошибкам.

В основных рекомендациях выполните следующие действия.

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

Пример

В этом примере показано, как производный класс может скрывать не виртуальные функции и как виртуальные функции разрешают перегрузки и переопределения:

// C26434.cpp
struct Base
{
    virtual ~Base() = default;
    virtual void is_virtual() noexcept {}
    void not_virtual() noexcept {}
};

struct Derived : Base
{
    void is_virtual() noexcept override {}      // Okay, override existing function
    virtual void is_virtual(int i) noexcept {}  // Add a virtual overload for function
    void not_virtual() noexcept {}              // C26434, hides a non-virtual function
    virtual void not_virtual(int i) noexcept {} // C26434, and parameters ignored
};