Bonjour,
Je voudrais connaitre la différence entre :
dynamic_cast<TMaClasse*>(MonObjet)->
et
((TMaClasse *)MonObjet)->
Merci d'avance pour votre aide !
Version imprimable
Bonjour,
Je voudrais connaitre la différence entre :
dynamic_cast<TMaClasse*>(MonObjet)->
et
((TMaClasse *)MonObjet)->
Merci d'avance pour votre aide !
Pour ma part, j'ai toujours utilisé la seconde solution, et je n'ai jamais eu de soucis.
Même si je ne l'ai jamais utilisé, il me semble (d'après quelques vagues souvenirs, donc à vérifier) que dynamic_cast soit plus sûr, puisqu'il permet uniquement de transtyper dans une même hiérarchie, et ainsi de contrôler qu'on ne fait pas n'importe quoi.
Un exemple absurde pour montrer une différence entre les deux méthodes de cast:
Code:
1
2
3
4
5
6
7
8 TButton *btn = new TButton(this) ; TEdit *edt1 = (TEdit*)btn ; //passe à la compilation TEdit *edt2 = dynamic_cast<TEdit*>(btn) ; //ne passe pas à la compilation ShowMessage( edt1->Text ) ; ShowMessage( edt2->Text ) ; delete btn;
J'ai donc perdu une occasion de me taire!
Par contre étant donné que c'est le genre de sujet que je ne maitrise pas du tout, je vient à la pêche au informations!
Comment activer RTTI (autrement qu'en cochant la case "Activer RTTI" dans les options du projet, ce qui est mon cas) pour que le code compile?
Pardon, moi aussi j'ai dit une bêtise: ça compile très bien... avec Visual Studio. Apparemment, Builder fait un contrôle supplémentaire (vu qu'il connait la hiérarchie des composants), ce qui n'est d'ailleurs pas conforme à la norme C++ (comme d'hab avec Builder).
Pour que ça se compile, il faut d'abord le transformer en TObject (ou n'importe quelle classe dont hérite TButton et TEdit), puis en TEdit:
Code:
1
2
3
4
5
6
7
8
9 TButton *btn = new TButton(this); TObject *Object = btn; TEdit *edt1 = (TEdit*)btn ; //passe à la compilation TEdit *edt2 = dynamic_cast<TEdit*>(Object) ; //passe aussi à la compilation, mais edt2 == NULL ShowMessage( edt1->Text ) ; ShowMessage( edt2->Text ) ; delete btn;