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(.....);