Megosztás a következőn keresztül:


Figyelmeztetés C26436

A virtuális függvényt tartalmazó "szimbólum" típusnak nyilvános vagy védett nem virtuális destruktorra van szüksége (c.35)

C++ alapvető irányelvek: C.35: Az alaposztály-destruktornak nyilvánosnak és virtuálisnak, illetve védettnek és nem virtuálisnak kell lennie

Ha egy osztály meghatároz egy virtuális függvényt, az polimorfikussá válik, ami azt jelenti, hogy a származtatott osztályok megváltoztathatják a viselkedését, beleértve az erőforrás-kezelési és a megsemmisítési logikát is. Mivel az ügyfélkód polimorf típusokat hívhat meg az alaposztályokra mutató mutatókkal, az ügyfél nem tudja kifejezetten kiválasztani, hogy melyik viselkedés megfelelő leküldés nélkül. Annak érdekében, hogy az erőforrások kezelése egységes legyen, és a megsemmisítés a tényleges típus szabályainak megfelelően történjen, meg kell határoznia egy nyilvános virtuális destruktort. Ha a típushierarchia úgy van kialakítva, hogy letiltsa az ügyfélkódot az objektumok közvetlen elpusztításához, a destruktorokat védett, nem virtuálisként kell definiálni.

Megjegyzések

  • A figyelmeztetés egy típus első virtuális függvénydefinícióján jelenik meg (ez lehet virtuális destruktor, ha nem nyilvános), típusonként egyszer.

  • Mivel a definíciók a deklarációtól elkülönítve helyezhetők el, előfordulhat, hogy nem mindig rendelkeznek a virtuális meghatározókkal. A figyelmeztetés azonban továbbra is érvényes: ellenőrzi egy függvény tényleges "virtualitását".

Kódelemzés neve: NEED_VIRTUAL_DTOR.

példa

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

A figyelmeztetés nem jelenik meg, ha az alaposztály virtuális nyilvános destruktorsal vagy védett nem virtuális destruktorsal rendelkezik.

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