I costruttori e i distruttori sono funzioni membro speciali. In generale si legge ovunque che la costruzione inizia dal tipo meno derivato nella gerarchia fino al tipo più derivato. Questo è in realtà l'ordine in cui l'esecuzione del costruttore viene completata, ma non il modo in cui viene avviata la costruzione.
Costruttori lista di inizializzazione ordine di esecuzione garantisce che mentre costruttore dell'oggetto più derivato sarà il primo costruttore per avviare l'esecuzione sarà l'ultimo costruttore per completare
Quando si crea un'istanza di un oggetto il costruttore più derivato che corrisponde la chiamata di costruzione viene chiamata per prima. Viene avviato l'elenco di inizializzazione del costruttore più derivato con corrispondenza e gli elenchi di inizializzazione hanno un ordine fisso: in primo luogo vengono richiamati i costruttori delle classi di base nell'ordine o nell'aspetto all'interno dell'elenco di ereditarietà. Quindi i costruttori di attributo membro vengono chiamati nell'ordine in cui appaiono nella dichiarazione di classe (non nell'ordine in cui compaiono nell'elenco di inizializzazione). Una volta completato l'intero elenco di inizializzazione (ad ogni livello), viene eseguito il blocco del corpo del costruttore, al termine del quale viene completata la chiamata del costruttore.
Tutti i distruttori di base verranno chiamati in ordine inverso di costruzione dopo che il distruttore più derivato ha completato l'esecuzione. La distruzione avviene in ordine inverso di costruzione.
I distruttori sono speciali in un modo diverso: non possono essere sostituiti. Quando chiamate il distruttore più derivato di una classe, completerà l'esecuzione del corpo del distruttore, dopo di che tutti i distruttori dell'attributo membro verranno chiamati in ordine inverso alla creazione. Dopo che il distruttore più derivato ha completato e così fatto i membri distruttori dell'oggetto più derivato, il distruttore delle sue basi più dirette si avvia in ordine inverso di costruzione, i corpi del distruttore verranno eseguiti, quindi il membro attribuisce i distruttori e così via. Alla fine tutti gli elementi costruiti saranno distrutti.
distruttori di classi polimorfiche dovrebbe essere virtuale
La descrizione sopra distruzione inizia con la chiamata al distruttore massima derivazione.Questo può essere ottenuto chiamando delete
su un puntatore al tipo più derivato, quando un oggetto automatico esce dall'oscilloscopio o quando l'oggetto è delete
d attraverso una classe base il cui distruttore è virtuale.
Se si dimentica di aggiungere la parola chiave destructor nella classe base e si tenta di eliminare un oggetto derivato tramite un puntatore alla base, si chiamerà direttamente il distruttore di base e ciò implica che tutti gli oggetti secondari sotto il puntatore digitano la gerarchia non sarà adeguatamente distrutta. Tutte le gerarchie di ereditarietà in cui si eliminano gli oggetti tramite puntatori a un tipo di base devono avere distruttori virtuali. Come regola generale, se hai già un metodo virtuale, il costo di rendere virtuale il distruttore è trascurabile ed è una rete sicura. Molte guide di codifica impongono che i distruttori nelle gerarchie di ereditarietà siano virtuali. Alcuni arrivano addirittura a richiedere la virtualizzazione di tutti i distruttori, con l'intenzione di evitare possibili perdite di risorse al costo di aggiungere un vtable per tutti i tipi e un puntatore vtable per tutti gli oggetti.
fonte
2009-10-28 22:55:24
I due modi migliori per ottenere risposte a semplici domande C++: 1) scrivere un semplice caso di test (ad esempio, mettere Couts nei costruttori e distruttori), e 2) vedere se è risposto a http: // www. parashift.com/c++-faq-lite/ – Artelius
Di solito aiuta ad avere la domanda rilevante per ciò che stai chiedendo, invece di far guardare a tutti la descrizione per vedere cosa stai effettivamente chiedendo. –
Questo codice non verrà compilato per una serie di motivi. Cioè una classe Banana non può avere un distruttore "~ MyBase()". Si prega di verificare il codice, prima di pubblicare. –