Dubbi sul dynamic_cast

di il
9 risposte

Dubbi sul dynamic_cast

Cercando in giro ho trovato che il dynamic_cast mi permette di convertire da classe base a classe derivata. Io ho fatto un sacco di prove, ma ho a e B che deriva da A e scrivo

A* a=new A();
B* b= dynamic_cast <B*> (a);
mi da sempre b=0 (che io metta virtual, non virtual, o altro nelle classi). Ora o sono io che non ho capito bene il concetto, o non so cosa. Riuscite a spiegarmi brevemente dove sbaglio?

9 Risposte

  • Re: Dubbi sul dynamic_cast

    Vediamo se questa ti aiuta
    http://en.cppreference.com/w/cpp/language/dynamic_cas
    Fai attenzione al d2.
  • Re: Dubbi sul dynamic_cast

    
    Base* b1 = new Base;
    Derived *d1 = dynamic_cast<Derived*>(b1);
    
    Questa da d1=0, quindi il mio dubbio è sempre quello. In qualsia modo siano strutturate le due classi base e derivata, o da errore che una classe non è polimorfa o da sempre 0. Quindi secondo me alla fine il dynamic_cast serve solo per vedere se un puntatore/riferimento è sottotipo di un altro e basta, non a convertire da base a derivata. È questo che non riesco a capire.
  • Re: Dubbi sul dynamic_cast

    dragneel ha scritto:


    Riuscite a spiegarmi brevemente dove sbaglio?
    Non puoi convertire le pere in mele, le pere non sono mele e non c' è conversione che tenga. (lo stesso vale per i pani e i pesci ma qui il discorso si fa complicato).

    Scherzi a parte, supponiamo che la classe A contega i campi x e y e la classe b aggiunga il campo z. Quando istanzi un A crei una zona di memoria che contiene x e y, e quando istanzi un B crei una zona di memoria che contiene x, y, z.

    Quando fai i cast non cambi la natura dell' oggetto che hai allocato ma solo il modo in qui lo vedi. Se hai un oggetto di tipo B lo puoi usare come un A, ti limiterai ad usare x e y, e z sarà inacessibile, ma se hai un A non puoi usarlo come un B in quanto gli manca il campo Z.

    quindi:

    - A* = new A() è un oggetto A non puo diventare un B.
    - A* = new B() è un oggetto B, lo puoi usare come un A tramite un A*, e lo puoi usare come un B attraverso un cast da A* a B* (cambi il tipo del puntatore non ciò a cui punta).

    Tornando alle pere, la Pera è un Frutto, ma un Frutto non è una Pera, il dynamic_cast esaminando gli oggetti puntati (e non il tipo del puntatore) ti dice se vale la relazione è un.
  • Re: Dubbi sul dynamic_cast

    Aggiungo ancora una cosa.

    Il dynamic_cast si chiama cosi perchè effettua il controllo a run-time a differenza dell' static_cast che lavora solo a compile-time.
    A* ptr = NULL;
    if (condizione qualsiasi)
       ptr = new A();
    else
       ptr = new B();
    
    Posso convertire ptr da A* a B* ? uno static_cast mi dirà sempre di no, a priori A non è un B. Un dynamic_cast valutera la cosa a run-time e a seconda di quale condizione si è verificata farà la conversione oppure no.
  • Re: Dubbi sul dynamic_cast

    Una spiegazione sui cast C++
    http://www.eptacom.net/pubblicazioni/pub_it/iso_6.htm
  • Re: Dubbi sul dynamic_cast

    Quindi nonostante ovunque ci sia scritto che il dynamic_cast permette di convertire un puntatore base a uno derivato(da A*=new A a B*) , in realtà non lo fa. Cioè, lo fa, ma ritorna sempre 0 giusto?
    - A* = new B() è un oggetto B, lo puoi usare come un A tramite un A*, e lo puoi usare come un B attraverso un cast da A* a B* (cambi il tipo del puntatore non ciò a cui punta).
    In questo caso la conversione con il dynamic_cast a B* funziona perché perchè col new B ho il tipo dinamico B* e non A* no?
  • Re: Dubbi sul dynamic_cast

    dragneel ha scritto:


    ... giusto?
    Giusto!

    Diciamo meglio la definizione di dynamic_cast:

    il dynamic_cast permette di convertire un puntatore ad una classe base a un puntatore a una classe derivata, la conversione ha successo solo se il puntatore punta effettivamente ad un oggetto della classe derivata, altrimenti restituisce 0. La verifica viene effettuata a run-time.
  • Re: Dubbi sul dynamic_cast

    Grazie. Certo che cercando e trovando una cosa del genere, non sapevo più che pensare.
    Il costrutto dynamic_cast permette di convertire un puntatore ad un oggetto di una classe base ad uno di classe derivata, ma solo se la classe base non possiede metodi virtuali.
  • Re: Dubbi sul dynamic_cast

    dragneel ha scritto:


    Grazie. Certo che cercando e trovando una cosa del genere, non sapevo più che pensare.
    Il costrutto dynamic_cast permette di convertire un puntatore ad un oggetto di una classe base ad uno di classe derivata, ma solo se la classe base non possiede metodi virtuali.
    L' hai trovato su vikipedia in italiano.

    Se guardi la versione inglese vedrai che dice il contrario!

    // Since RTTI is included in the virtual method table there should be at least one virtual function.
Devi accedere o registrarti per scrivere nel forum
9 risposte