dynamic_cast [visual c++] - C++ - Programmation
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?
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...
Marsh Posté le 15-06-2005 à 14:22:41
chrisbk a écrit : heuh bin : __non_rtti_object |
Et c'est quoi RTTI?
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)
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?
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...
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:
Par contre ca, ca marche :
En fait c'est le downcast qui ne passe pas, mais pourquoi?
Message édité par AsTro le 15-06-2005 à 14:02:58