Distruttore virtuale puro in C ++
-
08-07-2019 - |
Domanda
È sbagliato scrivere:
class A {
public:
virtual ~A() = 0;
};
per una classe base astratta?
Almeno questo si compila in MSVC ... Si bloccherà in fase di esecuzione?
Soluzione
Sì. Devi anche implementare il distruttore:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
dovrebbe bastare.
E dato che questo ha avuto un voto negativo, dovrei chiarire: se derivate qualcosa da A e quindi provate a cancellarlo o distruggerlo, alla fine verrà chiamato il distruttore di A
. Poiché è puro e non ha un'implementazione, ne deriverà un comportamento indefinito. Su una piattaforma popolare, che invocherà il gestore e il crash purecall.
Modifica: correzione della dichiarazione per renderla più conforme, compilata con http://www.comeaucomputing.com/tryitout /
Altri suggerimenti
Distruttori privati: ti daranno un errore quando crei un oggetto di una classe derivata - non altrimenti. Tuttavia, potrebbe apparire una diagnostica.
12.4 Distruttori
6 Un distruttore può essere dichiarato virtuale (10.3) o puro virtuale (10.4); se nel programma vengono creati oggetti di quella classe o di qualsiasi classe derivata, deve essere definito il distruttore.
Una classe con un puro distruttore virtuale è una classe astratta. Nota bene:
10.4 Classi astratte
2 Una funzione virtuale pura deve essere definita solo se chiamata con, o come con (12.4), la sintassi dell'ID qualificato (5.1).
[ Nota : una dichiarazione di funzione non può fornire sia un puro specificatore che una definizione & # 8212; end nota]
Tratto direttamente dalla bozza:
struct C {
virtual void f() = 0 { }; // ill-formed
};