Distruttore virtuale puro in C ++


Risposte:


218

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, Aalla 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/


16
Ehm, si lo è. Pure significa solo che una classe derivata deve anche fornire un'implementazione.
MSN

72
L'implementazione di funzioni virtuali pure è in effetti legale. Molto utile per fornire un'implementazione predefinita ma forzando le sottoclassi a chiamarla esplicitamente.
jmucchiello,

6
MSN e nota se hai quella definizione nell'intestazione, devi mettere "inline" prima di evitare la violazione dell'ODR (una regola di definizione)
Johannes Schaub - litb

2
Perché A :: ~ A () deve essere definito esplicitamente, poiché, ho pensato che ci fosse un distruttore predefinito per ogni oggetto? Come in ogni tipo di eredità, la catena di distruttori viene sempre chiamata e il distruttore della classe base non deve essere sempre definito.
jeffD

11
Un modo migliore per dirlo è che una volta dichiarato un distruttore, non viene automaticamente implementato per te.
MSN

49

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
};

14
+1. Penso che anche Herb Sutter abbia delle buone informazioni su questo: gotw.ca/gotw/031.htm . È interessante notare che qualsiasi pura funzione virtuale può avere un'implementazione fornita, non solo distruttori.
Fred Larson,

6
Sì, è qualcosa che fai in un'intervista per spaventare i tuoi intervistatori;)
Dirkgently

1
In realtà non è poi così raro, nella mia esperienza.

@Neil Butterworth: quale?
diretto il

@Dirk - lo scenario "qualsiasi funzione". Non è raro trovarlo usato per implementare un comportamento comune.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.