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


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

Тип "symbol" с виртуальной функцией требует общедоступного или защищенного деструктора, отличного от виртуальных (c.35).

Основные рекомендации по C++: C.35: деструктор базового класса должен быть общедоступным и виртуальным, либо защищенным и невиртуальным

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

Замечания

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

  • Так как определение может быть помещено отдельно от объявления, оно может не всегда иметь ни одного из виртуальных описателей. Но предупреждение по-прежнему допустимо: проверяет фактическую "виртуальность" функции.

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

Пример

namespace no_destructor
{
    struct base {
        virtual void foo() {} // C26436, see remarks to understand the placement of the warning.
    };
}

Предупреждение не отображается, если базовый класс имеет либо виртуальный общедоступный деструктор, либо защищенный не-виртуальный деструктор.

namespace virtual_destructor
{
    struct base {
        virtual ~base();
        virtual void foo() {}
    };
}
namespace protected_destructor
{
    struct base {
        virtual void foo() {}
    protected:
        ~base() {}
    };
}