Sinceramente è strano...ho provato con il visual studio questo esempio ed i distruttori vengono chiamati nell'ordine corretto.
codice:
// test.cpp : definisce il punto di ingresso dell'applicazione console.
//
#include "stdafx.h"
#include <windows.h>
class clsTest
{
private:
int a;
public:
clsTest(int _a)
{
a = _a;
}
clsTest(clsTest &s)
{
a = s.a;
}
virtual ~clsTest()
{
printf("clsTest destructor\r\n");
}
bool someFunc(CHAR *s)
{
printf("OK: %d\r\n", a);
return true;
}
};
class clsTest1 : public clsTest
{
public:
clsTest1() : clsTest(5)
{
}
clsTest1(clsTest1 &s)
: clsTest(s)
{
}
~clsTest1()
{
printf("clsTest1 destructor\r\n");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
{
clsTest1 tmp_t1;
clsTest1 tmp_t2(tmp_t1);
tmp_t1.someFunc("");
tmp_t2.someFunc("");
}
getchar();
return 0;
}
Direi che l'operatore non e' corretto. Prima di tutto deve accettare un const reference altrimenti si mette a chiamare costruttori di copia inutilmente per creare oggetti temporanei; per lo stesso motivo deve ritornare un reference all'oggetto. Quindi:
codice:
calciatore &calciatore::operator=(const calciatore &obj)
{
atleta *p;
p=this;evitando di scivere queste istruzioni per chiamare l'operatore = di atleta
*p=obj;
if(strlen(obj.ruolo)>strlen(ruolo))
{
delete [] ruolo;
ruolo=new char [strlen(obj.ruolo)+1];
if(!ruolo)
exit(1);
}
strcpy(ruolo,obj.ruolo);
return *this;
}
Poi sinceramente non capisco l'uso di p. Se è per richiamare l'operatore= di atleta puoi chiamarlo direttamente così:
codice:
calciatore &calciatore::operator=(const calciatore &obj)
{
atleta::operator=(obj);
if(strlen(obj.ruolo)>strlen(ruolo))
{
delete [] ruolo;
ruolo=new char [strlen(obj.ruolo)+1];
if(!ruolo)
exit(1);
}
strcpy(ruolo,obj.ruolo);
return *this;
}
un operatore non è altro che una normale funzione se non per il fatto che il compilatore sa come chiamarla in maniera implicita. Con l'operatore di scope non fai altro che forzare la chiamata dell'operator= di atleta.