Conversione dinamica a classe sorella

di il
3 risposte

Conversione dinamica a classe sorella

Salve, c'è qualcuno che è in grado di spiegarmi a cosa serve il cast dinamico ad una classe sorella? Il dynamic_cast lo permette, ma non riesco a capire in quali situazioni questa conversione possa essere utile. Se ho le tre classi:

class Padre { };
class Figlio: public Padre{ };
class Figlia: public Padre{ };

e in un sorgente faccio:

Figlio* p = new Figlio();
Figlia* d =dynamic_cast<Figlia*>(p);

che cosa ho concluso? Non riesco a capire.
Grazie

3 Risposte

  • Re: Conversione dinamica a classe sorella

    Non è così che si usa il dynamic_cast.
    Esempio:
    
    class Padre {
        public:
            virtual ~Padre() {} // dynamic_cast richiede almeno una funzione virtuale.
            void do_padre() { cout << "padre" << endl;}
    };
    
    class Figlio :public Padre {
        public:
            void do_figlio() { cout << "figlio" << endl; }
    
    };
    
    class Figlia : public Padre {
        public:
            void do_figlia() { cout << "figlia" << endl; }
    };
    
    ...
    
    void test(Padre* pater) {
        if (pater == nullptr) return;
        // funzione comune alla gerarchia.
        pater->do_pater();
    
        // ma se provo ad accedere a do_figlio direttamente da pater ho un errore
        // di compilazione perché do_figlio non è una funzione della classe Padre.
        // uso dynamyc_cast<>. 
        Figlio* figlio = dynamic_cast<Figlio*>(pater);
        // Se il cast fallisce, figlio == nullptr 
        if (figlio != nullptr) { 
            // ora posso chiamare do_figlio.
            figlio->do_figlio();
        } 
    }
    
    int main( /* etc */) {
        Padre* p1 = new Figlio;
        Padre* p2 = new Figlia;
    
        test(p1);
        test(p2);
    
        delete p1;
        delete p2;
    
    }
    
    Attenzione comunque a non esagerare con i dynamic_cast<> è risaputo che sono parecchio lenti.
  • Re: Conversione dinamica a classe sorella

    Ma se chiamo test() passandogli p2 non funziona. E' normale che se passo p1 funziona, dato che p1 punta ad un oggetto di tipo figlio, quindi all'interno di test faccio un downcast. Se però passo p2 all'interno di test() faccio un sidecast, e non funziona. Eppure ho trovato su alcuni libri che dynamic_cast può convertire pure ad una classe sorella, cioè fare il sidecast.
  • Re: Conversione dinamica a classe sorella

    Ho capito: posso convertire un puntatore ad una classe sorella quando il puntatore punta ad un oggetto di una classe discendente di entrambe. Per esempio ho le tre classi Padre, Madre e Figlio, con Figlio che deriva da entrambe Padre e Madre. Istanzio un puntatore a Padre e lo faccio puntare ad un oggetto di tipo Figlio; questo puntatore lo posso convertire in un puntatore di tipo Madre.
Devi accedere o registrarti per scrivere nel forum
3 risposte