Newsgroup: it.comp.lang.c++
Titolo: Domandina (stupida) sulle funzioni virtuali.

Salve a tutti!
Leggo spesso questo Newsgroup ma non sono mai intervenuto.
Ora avendo cambiato lavoro, dovrň iniziare a utilizzare il c++ come 
linguaggio.
Volevo porre una domanda (che son sicuro č dettata dalla mia poca esperienza 
del c++): perchč fare il distruttore di tipo "virtual"?
Grazie anticipatamente
oPKo
_________________________________________________________________________
Get Your Private, Free E-mail from MSN Hotmail at 
http://www.hotmail.com
.
Share information about yourself, create your own public profile at 
http://profiles.msn.com
.
--
Posted from [195.99.244.2] by way of 
law2-f281.hotmail.com
 [216.32.180.135] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 del c++): perchè fare il distruttore di tipo "virtual"?
perché il distruttore è uno di quei metodi sui quali il polimorfismo è
bene (necessario?) che operi.
Supponiamo, per esempio, che tu abbia una classe B e una classe A da
essa discendente e B nel suo costruttore alloca un oggetto
dinamicamente. Nel distruttore di B presumibilmente provvederai a
deallocare l'oggetto e poi a chiamare il distruttore dell'antenato.
Da questo discende che all'atto della distruzione di un reference
dichiarato come A&, ma che al run-time risulti essere un'istanza del
tipo B, è necessario quindi che il distruttore che venga effettivamente
chiamato sull'istanza sia quello di B, così da non lasciare spazzatura
in memoria.
Saluti,
Marcello.

 del c++): perchč fare il distruttore di tipo "virtual"?
Il distruttore virtuale serve a risolvere la problematica della delete.
Esempio:
classe A
{
ecc...
ecc...
}
classe B : public A
{
ecc...
ecc...
}
void distruggi(A* pA)
{
    delete A;
}
In caso di distruttore non virtuale sulla classe A, la funzione delete A
invoca sempre il distruttore di A.
In caso di distruttore virtuale (dichiarato nella classe A), la funzione
delete A invoca il distruttore dell'oggetto che effettivamente passo alla
funzione (che puň essere un'oggetto di classe A o di classe derivata come
B).
Porlock.

 lasciare spazzatura in memoria.
A quale "spazzatura" ti riferisci?

 del c++): perchè fare il distruttore di tipo "virtual"?
Se si vuole che anche per esso entri in gioco il meccanismo del late
binding e cioè se si vuole che gli oggetti vengano distrutti
correttamente (attraverso il distruttore del giusto tipo dinamico) anche
in presenza di polimorfismo (se il tipo statico è, ad esempio, quello
della classe base).
EMG

 A quale "spazzatura" ti riferisci?
Ad una eventuale serie di oggetti dinamicamente (new, malloc) creati dal
costruttore di B.
Bye,
Marcello.

della classe base).
Credo che, secondo lo standard, vi sia comportamento indefinito per la
chiamata del distruttore di una classe B derivata da A, in cui il
distruttore non sia stato definito "virtual".
Se non mi sbaglio c'era un articolo di Pescio in proposito...
--
Andrea Laforgia (ICQ 87230455)
------------------------------ 
#exclude <windows.h>

 Se non mi sbaglio c'era un articolo di Pescio in proposito...
Giusto. Il problema consiste nel fatto che, in assenza di distruttore
virtuale, una chiamata all'operator delete chiamerebbe solo quello della
classe base e non quello del tipo effettivo e questo avrebbe
comportamento undefined.
EMG

comportamento undefined.
Esatto, infatti, se non ricordo male, l'esempio riportato da Pescio
riguardava proprio l'uso del "delete". Mi compiaccio del fatto che
l'amico EMG e' sempre piu' riconoscibile come un guru del C++, oltre
che del C ;)


 che del C ;)
Ti ringrazio ma purtroppo l'appellativo di guru del C++ non mi calza. Di
guru veri ce ne sono in questo ng ed io non sono tra quelli. :-)
EMG