View Single Post
Old 05-05-2005, 11:59   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Che io sappia non c'è...in primo luogo perchè non tutti gli oggetti derivano da un oggetto base...

Fai una cosa di questo tipo...ti crei un oggetto base per tutti i tuoi tipi di oggetti (suppongo che gli oggetti che vuoi instanziare siano oggetti personalizzati)...
Codice:
class classe_base //classe base astratta
{
public:
   classe_base() {}; //costruttore di default
   virtual string tipo_classe() = 0; //funzione virtuale pura
};

class classe1: public classe_base //classe derivata da quella base
{
public:
   classe1() { };
   virtual string tipo_classe() { return "classe1"; };
};

class classe2: public classe_base //classe derivata da quella base
{
public:
   classe2() { };
   virtual string tipo_classe() { return "classe2"; };
};


//in oggetto è contenuto il tipo di oggetto da instanziare

classe_base *nuovo = NULL;

if(oggetto == "classe1") nuovo = new classe1;
if(oggetto == "classe2") nuovo = new classe2;
Il comportamento è simile a quello che cercavi...ma devi stare attento all'interfaccia... Se l'interfaccia è comune per tutte le classi e dichiari tutte le funzioni come viertuali nella classe base allora potrai usare indistintamente le classi a partire dalla classe base. Se non è così devi riconoscere se una istanza è quella dalla classe da te voluta tramite la funzione tipo_classe e poi fare un cast alla classe voluta...
Ad esempio:
Codice:
if(obj->tipo_classe == "classe1")
   ((classe1 *)obj)->funzione_della_classe1(.....);
if(obj->tipo_classe == "classe2")
   ((classe2 *)obj)->funzione_della_classe2(.....);
cionci è offline   Rispondi citando il messaggio o parte di esso