| Liste Articles: [0-A] [A-C] [C-F] [F-J] [J-M] [M-P] [P-S] [S-Z] | Liste Catégories | Une page au hasard | Pages liées | ||||||
Run-Time Type Information est un terme informatique utilisé pour signaler
la capacité d'un langage de programmation à
déterminer le type d'une variable lors de l'exécution d'un programme.
Bien que disponible dans la plupart des langages de programmation, le terme RTTI est souvent utilisé en référence au C++ qui par défaut, détermine le type à la compilation. Ce typage dynamique explicite en C++ – déclaré par l'utilisation de l'opération
dynamic_cast<> – diffère de celui automatique de l'Objective-C pour lequel le typage et l'édition
de liens sont réalisés lors de l'exécution.
Voici un exemple d'utilisation de la RTTI en C++ (j'espère plus concret que celui proposé dans l'article anglais où l'utilisation de la RTTI est inutile) :
class point;
class trait {
public:
virtual void dessine() = 0; // fonction virtuelle pure : la classe, abstraite, ne peut être instanciée
}
class segment : public trait { // classe dérivée de trait : doit implémenter dessine()
public:
point intersection(segment T);
point intersection(arc A);
};
class arc : public trait { // classe dérivée de trait : doit implémenter dessine()
public:
point intersection(segment T);
point intersection(arc A);
}
point intersection(trait &T1, trait &T2) {
segment S2 = dynamic_cast<segment &>(T2);
arc A2 = dynamic_cast<arc &>(T2);
if(S2) return T1.intersection(S2);
if(A2) return T1.intersection(A2);
}
Comme vous pouvez le voir, le but de la dernière fonction est de trouver le point d'intersection de deux traits dont les types
(arc ou segment) ne seront connus qu'à l'exécution du programme (c'est tout l'intérêt de l'héritage : avoir des pointeurs de la classe mère sur des instances
de classes filles). Le polymorphisme règle le problème pour la première variable (T1) puisque
T1.intersection() appelera arc::intersection() ou segment::intersection() suivant le type
de T1. Il reste cependant le problème du type de l'argument T2 puisque un simple appel à
T1.intersection(T2); génère une erreur du compilateur ne sachant quelle fonction utiliser à l'édition de lien.
Si le typage échoue (ce qui est forcément le cas dans mon exemple, soit pour S2, soit pour A2), le
programme peut générer une exception
bad_cast.


