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() {}
};
}