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
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 )
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).