Condividi tramite


Avviso C26436

Il tipo 'symbol' con una funzione virtuale richiede un distruttore pubblico virtuale o non virtuale protetto (c.35)

Linee guida di base C++: C.35: un distruttore di classe base deve essere pubblico e virtuale o protetto e non virtuale

Se una classe definisce una funzione virtuale diventa polimorfica, il che implica che le classi derivate possono modificarne il comportamento, inclusa la logica di gestione delle risorse e di distruzione. Poiché il codice client può chiamare tipi polimorfici tramite puntatori alle classi di base, non è possibile che un client possa scegliere in modo esplicito il comportamento appropriato senza eseguire il downcast. Per assicurarsi che le risorse vengano gestite in modo coerente e la distruzione si verifichi in base alle regole del tipo effettivo, è necessario definire un distruttore virtuale pubblico. Se la gerarchia dei tipi è progettata per impedire che il codice client elimini direttamente gli oggetti, i distruttori devono essere definiti come non virtuali protetti.

Osservazioni:

  • L'avviso viene visualizzato nella prima definizione di funzione virtuale di un tipo (può essere un distruttore virtuale se non è pubblico), una volta per tipo.

  • Poiché una definizione può essere inserita separatamente da una dichiarazione, potrebbe non avere sempre uno degli identificatori virtuali. Ma l'avviso è ancora valido: controlla la "virtualità" effettiva di una funzione.

Nome dell'analisi del codice: NEED_VIRTUAL_DTOR

Esempio

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

L'avviso non viene visualizzato quando la classe base ha un distruttore pubblico virtuale o un distruttore non virtuale protetto.

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