"ma c'è un modo per riconvertirlo: dal genitore, che è stato ottenuto da bambino, restituire classe figlio?"
Sì, come indicato nelle altre risposte, ci sono due modi per farlo.
Child * old_child = dynamic_cast<Child*>(parent);
Il risultato della dynamic_cast<>
può essere controllato in fase di esecuzione, in tal modo è possibile determinare se l'oggetto parent
rappresenta davvero un esempio Child
:
if(!old_child) {
// parent is not a Child instance
}
Si noti inoltre per ottenere questo funziona correttamente, le classi la domanda deve avere un vtable, che RTTI possa effettivamente determinare la loro relazione.La forma più semplice per raggiungere questo obiettivo, sta dando la classe Parent
una funzione distruttore virtuale
class Parent {
public:
virtual ~Parent() {}
// or
// virtual ~Parent() = default;
// as suggested for latest standards
};
NOTA:
Se questo dovesse applicarsi a una decisione generale di progettazione, vorrei fortemente non tenerne conto. Utilizzare invece pure virtual interfaces, che è garantito sia implementato o meno.
Il secondo modo di static_cast<>
può essere utilizzato in ambienti, dove sanno bene che parent
in realtà è un bambino. La forma più semplice di questo è la CRTP, dove Parent
prende la classe che eredita come un parametro di template
template <class Derived>
class Parent {
void someFunc() {
static_cast<Derived*>(this)->doSomething();
}
};
class Child : public Parent<Child> {
public:
void doSomething();
};
La validità di un instatiation di Parent<>
e static_cast<>
saranno controllati al momento della compilazione.
NOTA:
Un altro vantaggio è che è possibile utilizzare un'interfaccia per derivata che fa uso di
- membri della classe statici di
Derived
typedef
's forniti da Derived
- .. più tratti di classe, che possono essere controllati al momento della compilazione
'Bambino * old_child = dynamic_cast (genitore);' –
juanchopanza
Sì. ['static_cast <>' e 'dynamic_cast <>'] (http://stackoverflow.com/questions/28002/regular-cast-vs-static-cast-vs-dynamic-cast) possono essere utilizzati per fare questo. –
Grazie mille !!! – user2160982