Donc en indiquant que c'est une voiture on rajoute des caractéristiques,le moteur par exemple.
Exact.Citation:
Non. Quand on fait
Code:
vehicule* ve;
il n'y a aucun objet pointé par ve.
Version imprimable
Donc en indiquant que c'est une voiture on rajoute des caractéristiques,le moteur par exemple.
Exact.Citation:
Non. Quand on fait
Code:
vehicule* ve;
il n'y a aucun objet pointé par ve.
pour utiliser les caractéristiques il faut que tu cast sinon il ne voit que les caractérisitques d'un vehicule mais en revanche il utilise la méthode spécifique liée à la voiture
Donc en downcastant on rajoute réelement des caractéristiques.Citation:
pour utiliser les caractéristiques il faut que tu cast
On n'accéde pas à des caractéristiques existantes mais "cachées" précedemment.
ouaip en gros c ca :)
Non. On ne rajoute rien du tout en downcastant, on se rappelle qu'elles sont présentes. C'est tout.
(Et encore, à la condition que cela soit downcastable dans le type fils en question.)
Si A, B, C et D dérivent de M. Que tu as une fonction f qui travaille sur un M. Si dans la fonction tu te dis que si l'objet m est downcastable en un A, alors tu auras accès à des champs propres à A. Tu as tout faux. Parce que tu feras pareil pour B, C, D, et dans six mois pour E et F qui ne sont pas encore définies. Définir des fonctions polymorphes pour ignorer le polymorphisme n'a aucun intérêt. Tu as toutes les chances d'avoir un mauvais design.
note qu'il y a un upcasting implicite:Code:Vehicule *ve=new Voiture();
avec le downcasting tu fais le chemin inverse pour récupérer v (qui a été perdu) à partir de ve.Code:
1
2 Voiture *v=new Voiture(); Vehicule *ve = static_cast<Vehicule*>( v );
note que le cast porte sur le pointeur (dont le type change), mais pas sur l'objet pointé (qui reste toujours le même quel que soient les pointeurs qui le designe).
Donc comme le dit Luc Hermitte on a bien accés à des données qui étaient présentes mais "cachées" à cause de la nature du pointeur?Citation:
note que le cast porte sur le pointeur (dont le type change), mais pas sur l'objet pointé (qui reste toujours le même quel que soient les pointeurs qui le designe).
On ne touche pas à l'objet pointé en "l'agrandissant".
Sa place en mémoire n'est pas modifiée effectivement....
Si par exemple tu fait un dynamique_cast ça ne va pas réalouer de la mémoire pour 'rajouter' ce qu'il n'y a pas dans une class mere pour en faire une class fille...
L'intérêt du polymorphisme est justement la....
Voir par exemple le design patern factorie, la class factorie sait qu'elle va construire des véhicules (pour reprendre l'exemple du début), mais elle ne sais pas ce que c'est qu'un vélo, ou une voiture.... Donc la factorie elle retourne des véhicules, c'est l'utilisateur qui définie dans la factorie quel type de véhicule c'est, vélo, voiture, camion...
Merci de ces explications.