È 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?
È 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?
Risposte:
Sì. È inoltre necessario implementare il distruttore:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
dovrebbe bastare.
E dato che questo ha ottenuto un voto negativo, dovrei chiarire: se derivate qualcosa da A e quindi provate a cancellarlo o distruggerlo, A
alla fine verrà chiamato il distruttore. 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/
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 —end nota]
Tratto direttamente dalla bozza:
struct C {
virtual void f() = 0 { }; // ill-formed
};