Polymorphisme and co (C++)

Voila j’ai une super question de C++

Bon on va dire que j’ai une classe virtuelle A, deux classes B et C qui héritent de A et finalement une classe D qui hérite de B (et donc indirectement de A).

A un moment donné dans mon programme , je manipule un vecteur d’objets de type A.
je voudrais savoir si il est possible, non pas de connaitre le type d’un objet (ca marche avec des fonctions du type typeid()), mais de savoir si mon objet est soit de type B soit d’une classe dérivée de B.

Concrètement, je voudrais une méthode me permettant de savoir si mon objet possède les attributs de la classe B.
Donc dans l’exemple ci dessus, la méthode renverrait VRAI pour B et D mais faux pour C (car C n’hérite pas de :stuck_out_tongue:

Bon je sais pas si c’est bien clair, mais si certains parviennent à comprendre et connaissent des astuces ca m’interesse (pour l’instant je m’en sors avec des chaines de caractères, ca marche, mais je voudrais quelque chose de plus joli )

tu dois t’en sortir avec un dynamic_cast … il me semble.

style:

bool isBClass(A *p)
{
 B *p2 = dynamic_cast§;
 if(p2==0)
return false;
 return true;
}

un truc dans le genre quoi…

Hmmm merci, je vais tester ca.

EDIT: Ca marche merci. En fait je suis con, je le faisais une fois que j’etais sur que ct le bon type…

Ce message a été édité par glenyjob le 06/08/2004

Ma remarque est surement un peu bête, mais quand on a besoin de connaître la classe exacte d’un objet, ce n’est pas généralement le signe d’une mauvaise arborescence de classes ?
Normalement, le but du polymorphisme est justement d’éviter ce genre de problèmes…
Ah, sur ce point, vivent les Interfaces du java :P)

[quote]Ma remarque est surement un peu bête, mais quand on a besoin de connaître la classe exacte d’un objet, ce n’est pas généralement le signe d’une mauvaise arborescence de classes ?
Normalement, le but du polymorphisme est justement d’éviter ce genre de problèmes…
Ah, sur ce point, vivent les Interfaces du java :P)[/quote]Non, le polymorphisme permet de factoriser un traitement global, et à permettre un stockage généralisé dans un vecteur, justement.

Cependant, il est parfois nécessaire d’isoler les classes d’un type donnée, pour leur faire un traitement bien spécifique. Y’a la méthode naive, qui consiste a ajouter une méthode virtuelle identifiant le type, mais y’a beaucoup plus propre :c’est là que le dynamic cast intervient.

Java ou C#, on retrouve le même problème, mais résolu différemment (avec le mot clé As en C#, par exemple). Et pour ce qui est des interfaces, c’est aussi largement fesable en C++ (une interface n’étant qu’une bête classe virtuelle pure, vide de toute méthode ou membre).

Exactement!

Je m’en sortais avec la méthode naïve de la méthode virtuelle, mais ca ne me satisfaisait pas :stuck_out_tongue:

Maintenant j’ai quelque chose de plus propre et je suis content ,merci