Предупреждение 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() {}
};
}