2012-12-05 19 views
6

Ho bisogno di impostare una struttura di ereditarietà di classe, in cui la classe di base astratta contiene solo variabili membro (ma nessun metodo membro). I metodi membri verranno definiti dalle classi derivate. Quindi, quello che mi serve è questo post: Making a class abstract without any pure virtual methodscostruttore protetto contro puro distruttore virtuale

Dalla cima 2 risposte lì, ho capito ci sono 2 modi per realizzarlo:

  • rendere il distruttore pura virtuale.
  • Proteggi il costruttore.

Sono curioso di sapere la differenza tra i due approcci. Ci sono scenari in cui uno dovrebbe essere preferito all'altro (o forse alcune situazioni speciali in cui si dovrebbe lavorare ma non l'altro)? Ci ho pensato e non ho potuto pensare a niente.

Ho cercato tra le risposte su alcuni post qui (Is there a use for making a protected destructor virtual?, C++: Protected Class Constructor, Should an abstract class' destructor be pure virtual?) per provare a mettere insieme qualcosa, ma non sono riuscito a concludere.

risposta

3

La differenza principale è in

Base * ptr = new Derived; 
delete ptr; 

Con distruttore virtuale è legale, senza di essa non ci sarà UB. Anche dynamic_cast richiede almeno una funzione virtuale.
Quindi, se si desidera un comportamento polimorfico, utilizzare il distruttore virtuale (puro). Se non lo vuoi, usa il costruttore protetto e non pagare l'overhead per il polimorfismo (vtables). Ma poi dichiarare il distruttore anche protetto, per impedire l'eliminazione tramite il puntatore di base.

+1

Questo * veramente * non risponde alla domanda dell'OP. Un distruttore virtuale non puro può essere utilizzato con il caso del costruttore protetto e il codice di esempio mostrerà un comportamento definito. Stai parlando di un problema correlato, ma ortogonale. –

3

Entrambe le modalità raggiungono l'effetto desiderato utilizzando meccanismi completamente diversi. A mio parere uno protected constructor è più espressivo in quanto corrisponde esattamente alla descrizione del problema. Pure virtual destructor non è una soluzione naturale e potrebbe richiedere una documentazione aggiuntiva per spiegare il suo scopo. Inoltre costringerà le sottoclassi a implementare il distruttore anche se potrebbe essere stato saltato.

+0

Ho letto che se non si implementa esplicitamente il distruttore in una classe derivata, quello che viene generato automaticamente per loro è sufficiente. Quindi il puro distruttore virtuale non impone alle sottoclassi l'implementazione dei loro distruttori. – Wutz

+0

@Wutz, qual è lo scopo allora? –

+0

@ Michael Krelin - hacker: creazione dell'estrazione di classe base senza metodi virtuali puri. Può essere utile per consentire alla classe base di definire le implementazioni predefinite per i suoi metodi virtuali e impedirne comunque l'istanziazione diretta. – Wutz

Problemi correlati