Run-time type information

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

En informatique, Run-Time Type Information est utilisé pour signaler la capacité d'un langage de programmation à déterminer le type d'une variable pendant 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.

Exemple[modifier | modifier le code]

Voici un exemple d'utilisation du RTTI en C++ :

 1 class BaseClass {
 2 public:
 3     void foo() {}
 4 };
 5 
 6 class ExtendingClass : public BaseClass {
 7 public:
 8     void bar() {}
 9 };
10 
11 void callBarWithoutCast(BaseClass* base) {
12     // Ne compile pas car la classe BaseClass n'a pas de méthode bar()
13     base->bar(); 
14 }
15 
16 void callBarWithDynamicCast(BaseClass* base) {
17     ExtendingClass* extended = dynamic_cast<ExtendingClass*>(base);
18     // Le cast renvoi nullptr si le type de base n'est ou n'hérite pas d'ExtendingClass
19     if (extended != nullptr) {
20         extended->bar();
21     }
22 }

Dans cet exemple on souhaite appeler la méthode bar de l'objet passé en paramètre si celui-ci est de type réel D (ou héritant de D) (cf polymorphisme). L'appel ne peut pas se faire directement car la classe B n'expose pas de méthode bar(). On va donc essayer de caster le pointeur de type B* en un pointeur de type D* en utilisant mot clé dynamic_cast. Cet appel peut soit:

  • Renvoyer un pointeur null (nullptr) si le cast échoue càd que le type réel n'est pas D (ou héritant de D)
  • Renvoyer un pointeur D* si le cast réussi.

Pour faire cette vérification dynamic_cast a besoin d'avoir des informations sur le type au moment de l’exécution, et donc besoin du RTTI.

Voir aussi[modifier | modifier le code]