Se definiamo una classe astratta che ha un distruttore virtuale puro, perché dobbiamo dare una definizione di un distruttore nella classe astratta?Domanda sul distruttore virtuale puro
risposta
Il distruttore per la classe base deve essere chiamato quando l'oggetto viene distrutto, quindi necessita di una definizione.
Come indicato da Jesse, i distruttori ereditati vengono sempre chiamati (vengono chiamati dal compilatore senza alcun modo per sovrascrivere questo comportamento), quindi è ovvio che un distruttore virtuale deve avere un'implementazione. Quindi, se un distruttore virtuale puro deve avere un'implementazione, qual è la differenza tra un distruttore virtuale puro e un distruttore virtuale normale? Se la tua classe astratta ha solo dichiarato il distruttore virtuale e nessun altro metodo virtuale puro, rendere puro il distruttore impedirà a qualcuno di essere in grado di creare un'istanza della classe astratta.
Solo un operatore virtuale può essere dichiarato come puro. Ma poi, dato che aggiungi una dichiarazione, devi implementare il corpo del dtor. Come già accennato, i distruttori chiamano il loro genitore, fino alla catena dell'eredità.
perché lo standard dice così:
12.4.7 un distruttore può essere dichiarata virtuale (10.3) o di pura virtuale (10.4); se nel programma vengono creati oggetti di tale classe o classe derivata, deve essere definito il distruttore.
Il motivo è che viene chiamato esplicitamente quando un oggetto di una classe derivata viene distrutto.
puoi anche consultare le risposte alla mia domanda precedente: Under what circumstances is it advantageous to give an implementation of a pure virtual function?
Cosa c'è di sbagliato in questa risposta? O COSÌ, per quello? – Tobias
Non è corretto dire che è chiamato "esplicitamente". È stato utile che tu abbia fatto riferimento allo standard, ma dovresti modificare la tua risposta in modo che sia formalmente più corretta. "esplicitamente" è l'opposto di come normalmente vengono chiamati i distruttori. – nobar
- 1. costruttore protetto contro puro distruttore virtuale
- 2. Un distruttore di classe astratta dovrebbe essere puro virtuale?
- 3. Distruttore virtuale CRT
- 4. Operatore virtuale puro
- 5. Come risolvere "metodo virtuale puro chiamato"
- 6. Il distruttore predefinito può essere generato automaticamente come distruttore virtuale?
- 7. "undefined reference" per classe base virtuale distruttore
- 8. Perché enable_shared_from_this ha un distruttore non virtuale?
- 9. Chiamare il metodo virtuale dal distruttore - soluzione alternativa?
- 10. Implementazione di un distruttore virtuale in C++
- 11. eccezione con distruttore non virtuale C++
- 12. Classe derivata con distruttore non virtuale
- 13. C++: operatore di assegnamento virtuale puro
- 14. Domanda sul uscita var_dump
- 15. Domanda sul ciclo di velocità
- 16. Domanda sul disegno del tavolo
- 17. Domanda sul testo dopo iframe
- 18. Esiste un uso per rendere virtuale un distruttore protetto?
- 19. Il distruttore virtuale modifica il comportamento di decltype
- 20. Perché il distruttore di QWidget non è virtuale?
- 21. Devo chiamare esplicitamente il distruttore virtuale di base?
- 22. Errore linker: desidera il distruttore di classe base virtuale C++
- 23. Possibile perdita di memoria senza un distruttore virtuale?
- 24. Buona pratica: argomenti predefiniti per puro metodo virtuale
- 25. Mysql sul duplicato aggiornamento tasto + domanda secondaria
- 26. Domanda sul CreateObject() in VB6/VBA
- 27. domanda di base sul metodo di sovraccarico
- 28. Domanda sul costruttore della classe Java
- 29. Domanda sul polimorfismo e fusione di Java
- 30. JQuesta domanda sul raggruppamento di un JRE
Duplicate http://stackoverflow.com/questions/630950/pure-virtual-destructor-in-c – ralphtheninja