C'è qualche differenza tra un distruttore protetto e privato in C++? Se un distruttore delle classi di base è privato, immagino che venga ancora chiamato quando si elimina l'oggetto classe derivata.Protetto contro il private Destructor
risposta
Tratto da here:
Se il costruttore/distruttore viene dichiarata come privata, allora la classe non può essere istanziato.
Questo è vero, tuttavia può essere istanziato da un altro metodo nella classe. Allo stesso modo, se il distruttore è private
, l'oggetto può essere eliminato anche all'interno della classe. Inoltre, impedisce l'ereditarietà della classe (o almeno impedisce che la classe ereditata venga istanziata/distrutta).
public class A {private A() {} public A getA() {return new A(); }} Non esattamente vero. –
Non è vero. L'oggetto con distruttore privato * può * essere istanziato, (su una pila all'interno di una funzione amico, per esempio). – SadSido
Right non può essere allocato allo stack ma può essere assegnato all'heap e anche dalle funzioni friend ... –
Se il distruttore della classe base è private
o protected
, non è possibile chiamare delete
tramite il puntatore della classe base.
Utilizzare un distruttore protetto per impedire la distruzione di un oggetto derivato tramite un puntatore di classe base. Limita l'accesso al destuctor alle classi derivate. E impedisce gli oggetti automatici (stack) di classe base.
In effetti è usato per consentire a qualsiasi altra uso polimorfica di derivati classi tramite puntatori alla base, ma non consentire agli utenti di eliminare utilizzando tale puntatore . Esempio: - Classi di base/interfacce astratte.
Ma un protected
, non-virtual
distruttore sembra essere un bug in attesa di accadere. Supponendo che tu non fornisca una funzione destroy()
, devi eventualmente rendere pubblico il dtor. Appena lo fai, non hai più alcun controllo sulla classe e corri il rischio di una cancellazione polimorfica con un attore non virtuale, se qualcuno si allontana ulteriormente dalla tua classe.
Il seguente pezzo di codice comporterà l'errore del compilatore (VC2010): C2248: 'base :: ~ base': non può accedere membro privato dichiarato nella classe di 'base'
class base
{
~base(){}
};
class derived : public base
{
};
int main()
{
derived* d = new derived;
delete d;
}
Tuttavia, se si cambia il distruttore di base da proteggere, tutto funziona correttamente.
Ma anche se lo hai cambiato in 'protected', non puoi distruggere oggetti attraverso un puntatore di classe base. (In tal caso dovrebbe anche essere 'virtuale', BTW.) Che in qualche modo sconfigge molti degli scopi della derivazione ... – sbi
La risposta è che la tua ipotesi è sbagliata. Il distruttore della classe base non può essere chiamato quando è privato.
- 1. costruttore protetto contro puro distruttore virtuale
- 2. Ricerca contro AWS ElasticSearch protetto
- 3. Objective-C - Privato vs Protetto contro Pubblico
- 4. C++ 11 Destructor = delete
- 5. Pimpl + QSharedPointer - Destructor = Disaster
- 6. Destructor in Objective-C++
- 7. Binary Search Tree Destructor
- 8. Destructor in Asp.net
- 9. Funzioni private astratte
- 10. Utilizzo di "this" in destructor
- 11. ignora l'interno protetto con protetto!
- 12. Perché le eccezioni da unique_ptr destructor interrompono il programma?
- 13. Metodo protetto in python
- 14. interno protetto
- 15. Differenza tra destructor, dispose e finalize method
- 16. Esiste un uso per rendere virtuale un distruttore protetto?
- 17. Ereditarietà gerarchia: Constructor & Destructor sequenza di esecuzione
- 18. Constructor/Destructor ordine di chiamata sulla pila
- 19. Interfacce private
- 20. APL contro A contro J contro K?
- 21. Che cosa significa il modificatore protetto?
- 22. regole di autorizzazione corretta per il contenuto protetto in Firebase
- 23. Come sbloccare un PDF "protetto" (protetto da lettura) in Python?
- 24. forzare ottenere/impostare l'accesso di variabili private per proprietà private
- 25. Perché il metodo finalize() in java.lang.Object è "protetto"?
- 26. Java tra privato e protetto
- 27. Esiste una differenza tra Protetto interno e Interno protetto?
- 28. Spring Security - controlla se l'URL web è protetto/protetto
- 29. Classe membro statica: dichiarare la classe private e il membro della classe package-private?
- 30. Campo protetto schema Mongoose
Avrai alcuni problemi derivanti dalla classe con distruttore privato =) – SadSido
Duplicato per http://stackoverflow.com/questions/631783/questo-è-il-del-uso-di-having-distruttore-come-privato ? – SadSido
Domanda simile qui: http://stackoverflow.com/questions/224966/private-and-protected-members-c – Jordan