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?

È stato utile?

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
};
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top