Comprend pas le RTTI dans mon exemple - C++ - Programmation
Marsh Posté le 06-04-2003 à 17:54:07
kadreg a écrit : Voici un petit bout de code. C'est un petit exemple pour jouer avec les RTTI :
|
Tout a fait normal
Animal *paf = new Chien()
Tu definis *paf comme un animal auquel tu initialises en tant que Chien()
Si tu fais paf->Hello() il appelle la methode la classe chien car tu utilises virtual
Si tu recherches ce que c paf c une sorte d'Animal
Marsh Posté le 06-04-2003 à 17:56:09
J'ai compris !
Je teste paf qui est un pointeur sur mon chien, et pas mon instance de chien elle même !
En utilisant des référence ou en demandant le typeid (*paf), ça marche tout de suite correctement.
Marsh Posté le 06-04-2003 à 17:58:57
kadreg a écrit : J'ai compris ! |
c ce que j'ai dit
Marsh Posté le 06-04-2003 à 18:15:41
regarde aussi du coté du dynamic_cast, typeid() a des limitations au niveau de l'héritage, on ne peut pas s'en sortir avec
Marsh Posté le 06-04-2003 à 18:17:52
++Taz a écrit : regarde aussi du coté du dynamic_cast, typeid() a des limitations au niveau de l'héritage, on ne peut pas s'en sortir avec |
toutafé. Et j'aime aussi beaucoup le typeid qui marche pas sur les classes dérivant d'une classe n'ayant pas de membres virtuels.
Et puis typeid, c'est pas franchement conseillé comme truc
Marsh Posté le 06-04-2003 à 18:19:00
kadreg a écrit : |
Tiens tu m'apprends un truc là
Marsh Posté le 06-04-2003 à 18:22:08
samuelp a écrit : |
Voui, enlève le virtual devant le hello dans Animal. Voici la trace :
|
Tu rajoute une fonction virtuelle tutu jamais appelée dans Animal, et hop, ça remarche :
|
Marsh Posté le 06-04-2003 à 20:28:51
typeid ne sert en fait que lorsque l'on désire connaitre à tout prix le type, et ce prix, c'est la baisse de performance. Donc à utiliser avec modération, et surtout pas dans un énorme switch. voir les notions de classe abstraites, interfaces et le design pattern factory.
edit ou bien
Code :
|
Marsh Posté le 06-04-2003 à 20:44:21
++Taz a écrit : typeid ne sert en fait que lorsque l'on désire connaitre à tout prix le type, et ce prix, c'est la baisse de performance. Donc à utiliser avec modération, et surtout pas dans un énorme switch. voir les notions de classe abstraites, interfaces et le design pattern factory. |
Je me demande si tu as pas le même livre que moi sous les yeux
Marsh Posté le 06-04-2003 à 20:58:57
je lis rien en ce moment, cela dit j'ai une bonne mémoire et un cerveau.
Marsh Posté le 06-04-2003 à 21:01:21
comment est implanté le RTTI en C++ ? pkoi est il aussi lent ?
Marsh Posté le 06-04-2003 à 21:03:37
chrisbk a écrit : comment est implanté le RTTI en C++ ? |
Des fonctions automatiquement ajoutées dans la table des fonctions virtuelles par le compilateur (d'ou le fait que sur une classe n'ayant pas de fonctions virtuelles, ça ne marche pas), et des classes de type typeinfo crées automatiquement pour chaque classes.
Marsh Posté le 06-04-2003 à 21:05:36
ReplyMarsh Posté le 06-04-2003 à 21:06:12
aucune idée sur l'implémentation, je voudrais pas m'avancer à dire des conneries. c lent par que c'est des informations récupérés à l'exécution (sans deconner!). le problème c que typeid nécessite une grande quantité d'information sur l'objet, et colelcter tout ça, ça prends du temps.
faites attention à cette petite chose: si le resultat de typeid peut etre déterminer à la compilation, le RTTI sont statiques, donc typeid(ma_fonction()) n'exécutera pas ma_fontion
Marsh Posté le 06-04-2003 à 21:20:56
kadreg a écrit : |
ce c que je me suis dit au debut, mais finalement si c ca alors tu n'aurais pas eu ton pb d'animal au lieu de chien (eg avec la fonction virtuelle tu serais allé sur la "paf est un chien" ). ca n'explique pas la lenteur (genre la solution de taz devrait etre equivalente en vitesse alors), et qu'est ce qui empeche le compilo de creer une vtable pour le RTTI si il n'y en a pas ?
Marsh Posté le 06-04-2003 à 22:06:12
chrisbk a écrit : |
Nan, avec son code, il a comparé des pointeurs tout était statique, ils ont même pas été déréférencés (ce qui est une bonne nouvelle, ils auraient pu être nuls).
Marsh Posté le 06-04-2003 à 17:48:01
Voici un petit bout de code. C'est un petit exemple pour jouer avec les RTTI :
Et voici la trace d'exécution obtenue :
kadreg@rincevent:~/cplusplus/rtti$ ./rtti
je suis un chien
je suis une pierre
paf est un animal
kadreg@rincevent:~/cplusplus/rtti$
Je ne comprend pas la 3eme ligne "paf est un animal". La classe est bien instanciée en tant que Chien, Animal dispose bien d'au moins une fonction virtuelle. Je ne vois pas pourquoi j'obtient ici "paf est un animal" et pas "paf est un chien".
---------------
brisez les rêves des gens, il en restera toujours quelque chose... -- laissez moi troller sur discu !