La norme RTTI

© D. Mathieu     mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique
Créé le 20/12/1999 - Dernière mise à jour : 13/01/2000

Sommaire

Information run-time de type
Operateur typeid
Exception bad_typeid
Classe type_info
Bibliographie

Information run-time de type

    L'information "run-time" de type (RTTI) est un mécanisme qui permet de déterminer le type d'un objet durant l'exécution. RTTI fait partie du langage C++. La présentation de RTTI ci-dessous sera presque exclusivement réduite aux pointeurs, bien que les concepts s'appliquent aussi aux références. Trois éléments du C++ sont mis en jeu : Sommaire

 Operateur typeid

    L'opérateur typeid permet de déterminer le type d'un objet en cours d'exécution.

Syntaxe
 
typeid (type-id)
typeid (expression)

    Le résultat d'une expression typeid est un const type_info&. La valeur est une référence à un objet de la classe type_info qui représente soit le type-id soit le type de l'expression, selon la forme de typeid utilisée.

    L'opérateur typeid effectue un test run-time lorsqu'il est appliqué à une l-value d'un type de classe polymorphique, où le véritable type de l'objet ne peut être déterminé par l'information statique fournie, ce qui arrive dans les cas suivants :

    Le résultat est une référence à un type_info qui concerne :       Par exemple :
 
class Base { ... };
class Derived : public Base { ... };
void f()
{
    Derived* pd = new Derived;
    Base* pb = pd;
    ...
    const type_info& t  = typeid (pb);   // t  holds pointer type_info
    const type_info& t1 = typeid (*pb);  // t1 holds Derived info
    ...
}

    Si l'expression est une déréférence de pointeur, et si la valeur du pointeur est nulle, typeid lève l'exception bad_typeid. Si le pointeur n'est pas valide, c'est une exception __non_rtti_object qui est levée.

    Si l'expression n'est ni un pointeur ni une référence à une classe de base de l'objet, le résultat est une référence de type_info représentant le type statique de l'expression.

Sommaire

Exception bad_typeid

    Dans certaines circonstantes, l'opérateur typeid lève une exception bad_typeid dont l'interface est la suivante :
 
class bad_typeid : public logic {
  public:
    bad_typeid (const char * what_arg) : logic(what_arg) {}
    void raise () { handle_raise(); throw *this; }
    // virtual __exString what() const;    //inherited
};

Sommaire

Classe type_info

    La classe type_info décrit l'information générée dans le programme par le compilateur. Des objets de cette classe stockent effectivement un pointeur sur un nom pour le type. La classe type_info stocke aussi une valeur destinée aux opérations de comparaison de deux types. Les règles d'encodage des types ne sont pas spécifiées.

    L'entête typeinfo.h doit être inclus pour pouvoir utiliser la classe type_info.
 
class type_info {
  public:
    virtual ~type_info();
    int operator == (const type_info& rhs) const;
    int operator !=( const type_info& rhs) const;
    int before (const type_info& rhs) const;
    const char* name() const;
    const char* raw_name() const;

  private:
    ...
};

    Les opérateurs == et != peuvent être utilisés pour comparer deux objets type_info.

    La donnée membre type_info::name pointe sur une chaîne de caractères constante terminée par zéro qui représente un nom de type lisible.

    La donnée membre type_info::raw_name pointe sur une chaîne de caractères constante terminée par zéro qui représente un nom de type "décoré". Il représente un codage interne du nom, non lisible mais plus compact et plus efficace pour les comparaisons.

    La norme RTTI est activée dans le compilateur Visual C++ 4.0 en cochant la case correspondante dans le menu Project Setting :


figure 1

Sommaire

Bibliographie

Microsoft C++, version 4.0, Aide en ligne

© D. Mathieu     mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique