[visual c++]dynamic_cast

dynamic_cast [visual c++] - C++ - Programmation

Marsh Posté le 15-06-2005 à 14:01:00    

Salut,
J'ai deux classes qui s'appelle Category et Component qui héritent toutes les deux de la classe AbstractCat.
Je créé des objets Category et Component.
Plus loin dans le programme je les récupère sous forme de d'objets AbstractCat et j'aimerais donc les caster pour effectuer des opérations différentes selon que les objets sont des Category ou des Component.
Le problème est que mon dynamic_cast fait freezer le programme. Si je le termine, le debugger pointe dans le fichier dbgheap.c dans le malloc de la fonction : "_CRTIMP void * __cdecl malloc".
Et j'ai le message d'erreur suivant :
Unhandled exception at 0x77e738b2 in GetInfo.exe: Microsoft C++ exception: __non_rtti_object @ 0x0012f010.
 
Si je fais un dynamic_cast d'une Category vers une AbstractCat ca passe, mais pas l'inverse :(
 
Exemple de code qui ne marche pas:
 

Code :
  1. AbstractCat *abs = new AbstractCat("test" );
  2. if(Category *comp = dynamic_cast<Category*>(abs))
  3. CEditCtrl.SetWindowText("Category" );
  4. else
  5. CEditCtrl.SetWindowText("Other" );


 
Par contre ca, ca marche :
 

Code :
  1. Category *cat = new Category("test" );
  2. if(AbstractCat *comp = dynamic_cast<AbstractCat*>(cat))
  3. CEditCtrl.SetWindowText("AbstractCat" ); //ca passe forcément ici
  4. else
  5. CEditCtrl.SetWindowText("Other" );


 
 
En fait c'est le downcast qui ne passe pas, mais pourquoi?


Message édité par AsTro le 15-06-2005 à 14:02:58
Reply

Marsh Posté le 15-06-2005 à 14:01:00   

Reply

Marsh Posté le 15-06-2005 à 14:17:02    

J'ai lu un truc sur le net, comme quoi il y a ambiguïté si dans l'objet à caster coexistent plusieurs objets de meme type:

Lors d'un transtypage, aucune ambiguïté ne doit avoir lieu pendant la recherche dynamique du type. De telles ambiguïtés peuvent apparaître dans les cas d'héritage multiple, où plusieurs objets de même type peuvent coexister dans le même objet. Cette restriction mise à part, l'opérateur dynamic_cast est capable de parcourir une hiérarchie de classe aussi bien verticalement (convertir un pointeur de sous-objet vers un pointeur d'objet complet) que transversalement (convertir un pointeur d'objet vers un pointeur d'un autre objet frère dans la hiérarchie de classes).


 
Mon AbstractCat est en fait un heritage de vector<AbstractCat *>.
Est-ce que ca explique mon bug?
Si c'est bien ca, comment je fais pour downcaster alors?


Message édité par AsTro le 15-06-2005 à 14:17:29
Reply

Marsh Posté le 15-06-2005 à 14:18:52    

heuh bin : __non_rtti_object
 
visiblement y'a une couille la, dynamic cast se basant justement sur le RTTI...

Reply

Marsh Posté le 15-06-2005 à 14:22:41    

chrisbk a écrit :

heuh bin : __non_rtti_object
 
visiblement y'a une couille la, dynamic cast se basant justement sur le RTTI...


 
 
Et c'est quoi RTTI?

Reply

Marsh Posté le 15-06-2005 à 14:23:57    

Run Time Type Information. ah bin tiens, tu me fais penser, c'est un truc qu'il faut activer dans les options de VS (je sais pas si c'est mis par defaut)
 
regarde voir dans projects->option->C/C++->code generation ? (ou si c'est pas la, fouille un peu)

Reply

Marsh Posté le 15-06-2005 à 14:29:28    

Ok merci je viens de trouver.
Il faut activer le RTTI.
Project->Settings->C/C++->language->Enable RTTI
 
Mais pourquoi ce n'est pas activé par défaut? Y'a des risques a l'activer?


Message édité par AsTro le 15-06-2005 à 14:39:26
Reply

Marsh Posté le 15-06-2005 à 14:32:04    

doit avoir un surcout en mémoire

Reply

Marsh Posté le 15-06-2005 à 17:34:56    

En plus MFC implémente un mécanisme similaire (DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC). Cela explique pourquoi ça n'est pas activé par défaut...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed