Upozornění C26436
Typ "symbol" s virtuální funkcí potřebuje buď veřejný virtuální, nebo chráněný ne virtuální destruktor (c.35).
C++ Core Guidelines: C.35: Destruktor základní třídy by měl být veřejný a virtuální, nebo chráněný a nevirtuální
Pokud třída definuje virtuální funkci, stává se polymorfním, což znamená, že odvozené třídy mohou změnit své chování, včetně správy prostředků a logiky zničení. Vzhledem k tomu, že klientský kód může volat polymorfní typy prostřednictvím ukazatelů na základní třídy, neexistuje způsob, jak klient explicitně zvolit, které chování je vhodné bez downcastingu. Abyste měli jistotu, že se prostředky spravují konzistentně a dochází k zničení podle pravidel skutečného typu, měli byste definovat veřejný virtuální destruktor. Pokud je hierarchie typů navržena tak, aby nepovolila klientský kód zničit objekty přímo, destruktory by měly být definovány jako chráněné nevirtuální.
Poznámky
Upozornění se zobrazí u první definice virtuální funkce typu (může se jednat o virtuální destruktor, pokud není veřejný), jednou za typ.
Vzhledem k tomu, že definici lze umístit odděleně od deklarace, nemusí mít vždy žádný z virtuálních specifikátorů. Upozornění je ale stále platné: kontroluje skutečnou "virtualitu" funkce.
Název analýzy kódu: NEED_VIRTUAL_DTOR
Příklad
namespace no_destructor
{
struct base {
virtual void foo() {} // C26436, see remarks to understand the placement of the warning.
};
}
Upozornění se nezobrazí, pokud základní třída má buď virtuální veřejný destruktor, nebo chráněný ne-virtuální destruktor.
namespace virtual_destructor
{
struct base {
virtual ~base();
virtual void foo() {}
};
}
namespace protected_destructor
{
struct base {
virtual void foo() {}
protected:
~base() {}
};
}