[C++] dynamic_cast

dynamic_cast [C++] - Programmation

Marsh Posté le 31-07-2001 à 16:17:25    

Bonjour,
j'ai voulu utiliser dynamic_cast pour transformer un pointeur de classe mere vers une classe fille, du genre :
b = dynamic_cast<fille*>(a);
avec b derivant de a, et il plante a l'edition de liens:
undefined reference to `mere type_info function'
 
C'est normal, ou y'a un probleme de compilateur (c'est g++)?
Il faut savoir que j'ai aussi utilise un exemple de la doc C++ annotations (identique a ce que je veux faire) et il plante sur mon ordi, idem que pour mon prog:
http://www.icce.rug.nl/docs/cplusplus/cplusplus14.html (14.5.1)
 
Quelqu'un a une idee du probleme?

Reply

Marsh Posté le 31-07-2001 à 16:17:25   

Reply

Marsh Posté le 31-07-2001 à 16:27:51    

sebmarley a écrit a écrit :

Bonjour,
j'ai voulu utiliser dynamic_cast pour transformer un pointeur de classe mere vers une classe fille, du genre :
b = dynamic_cast<fille*>(a);
avec b derivant de a, et il plante a l'edition de liens:
undefined reference to `mere type_info function'
 
C'est normal, ou y'a un probleme de compilateur (c'est g++)?
Il faut savoir que j'ai aussi utilise un exemple de la doc C++ annotations (identique a ce que je veux faire) et il plante sur mon ordi, idem que pour mon prog:
http://www.icce.rug.nl/docs/cplusplus/cplusplus14.html (14.5.1)
 
Quelqu'un a une idee du probleme?  




 
POurquoi tu n'ecris pas ca :
b = (classeFille*) a;
 
Et si ca passe pas tu forces comme ca :
 
b = (classeFille*)((void*) a);
 
Je sais c'est bourrin et le cast en void* doit etre banni mais mon dieu que c'est pratique parfois.

Reply

Marsh Posté le 31-07-2001 à 16:29:51    

Guz a écrit a écrit :

 
 
POurquoi tu n'ecris pas ca :
b = (classeFille*) a;
 
Et si ca passe pas tu forces comme ca :
 
b = (classeFille*)((void*) a);
 
Je sais c'est bourrin et le cast en void* doit etre banni mais mon dieu que c'est pratique parfois.  




 
mouais c pas du C++, ce genre de cast porcin :ouch:

Reply

Marsh Posté le 31-07-2001 à 16:42:05    

Pour que dynamic_cast fonctionne il faut une fonction virtuelle dans la classe de base ( même si elle fait rien ...).

Reply

Marsh Posté le 31-07-2001 à 16:42:18    

C_Po_Ma_Faute a écrit a écrit :

 
 
mouais c pas du C++, ce genre de cast porcin :ouch:  




 
Je sais bien et j'evite mechament ce genre de trucs mais je connais pas son contexte, et si ca peut lui eviter de casser sa structure c'est peut etre une solution.

Reply

Marsh Posté le 31-07-2001 à 20:12:33    

seblamb a écrit a écrit :

Pour que dynamic_cast fonctionne il faut une fonction virtuelle dans la classe de base ( même si elle fait rien ...).  




 
je veux pas parrier mais il me semble que la présence de classe virtuelles n'est pas nécessaire pour avoir recours à dynamic_cast.

Reply

Marsh Posté le 31-07-2001 à 21:04:52    

LetoII a écrit a écrit :

 
 
je veux pas parrier mais il me semble que la présence de classe virtuelles n'est pas nécessaire pour avoir recours à dynamic_cast.  




 
je crois bien que seblamb a raison, faut que le type de base soit polymorphe => au moins une methode en virtual (mets le destructeur en virtual ca peut pas faire de mal ;) ).
 
Ah oui, active aussi le support de la RTTI ca peut pas faire de mal non plus.


---------------
"Si ton labeur est dur, et si tes résultats sont minces, rappelle-toi  
Reply

Marsh Posté le 01-08-2001 à 09:24:45    

Merci pour toutes ces reponses!!
seblamb -> je savais deja qu'il fallait une classe virtuelle, et ca ne marche pas quand meme
Guz -> avec ce genre d'astuce bourrine, je risque pas de perdre toutes mes donnees enregistrees dans a?
 
Mais le pire c que j'ai essaye l'exemple officiel dans le site que j'ai mis au 1er message, et ca marche pas -> y'a pas quelqu'un qui pourrait tester chez lui pour voir si ca vient pas de mon environnement?

Reply

Marsh Posté le 01-08-2001 à 09:28:24    

Par défaut certains compilateurs comme VC++ desactivent la RTTI.
Tu as vérifié ?

Reply

Marsh Posté le 01-08-2001 à 09:37:48    

je suis sous linux et je compile avec g++. Normalement elle est activee...

Reply

Marsh Posté le 01-08-2001 à 09:37:48   

Reply

Marsh Posté le 01-08-2001 à 09:41:51    

tu peux afficher l'example que tu utilises ?

Reply

Marsh Posté le 01-08-2001 à 09:53:16    

class mere {
public:
  virtual void Print();
 
};
 
class fille : public virtual mere {
public:
  int k ;
  void Print();
 
};
 
 
void fille::Print() {
  cout << "Print" << endl;
};
 
 
void main () {
  mere * a;
  fille * b;
  a = new mere;
  b = dynamic_cast<fille*>(a);
  cout << b->k << endl;
 
};
 
Voila tout le code!!! Je n'y comprends plus grand chose a cette erreur...

Reply

Marsh Posté le 01-08-2001 à 10:06:04    

Tu ne peux pas convertir a en type fille* parce que a contient la réference sur un objet de type mere.
Ton programme est faut c'est pour ça que ça plante.

Reply

Marsh Posté le 01-08-2001 à 10:30:18    

Mais meme si je mets a = new fille; ca plante quand meme!!

Reply

Marsh Posté le 01-08-2001 à 11:57:42    

Deja si dynamic_cast ne marche pas, le pointeur renvoyé est NULL. C'est tout l'intérêt de dynamic_cast, il faut tester le pointeur renvoyé.
Sinon j'ai testé. Si tu met 'a = new fille' ton programme fonctionne bien.
Et si tu met '#include<typeinfo>'

Reply

Marsh Posté le 01-08-2001 à 12:05:22    

donc c'est bien a cause de l'environnement, parce que moi ca plante completement a l'edition de liens!!! (et avec la rtti d'active). Merci d'avoir essayer, je sais maintenant que je dois changer d'idee si je veux terminer ce *** de prog!!

Reply

Marsh Posté le 01-08-2001 à 20:24:59    

Y a plein d'erreurs dans ton prog, il risque pas de compiler.

Reply

Sujets relatifs:

Leave a Replay

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