__rtti et option -RT
Remonter à Liste alphabétique des mots clés - Index
Catégorie (mot clé __rtti)
Modificateurs (C++), Extensions des mots clés, Mots clés spécifiques C++
Description
L'identification de type à l'exécution est activée par défaut. Vous pouvez désactiver RTTI sur la page C++ de la boîte de dialogue Options du projet. À partir de la ligne de commande, utilisez l'option -RT- pour le désactiver ou -RT pour l'activer.
Si RTTI est activé, ou si l'argument passé à typeid est un pointeur ou une référence à une classe non polymorphe, typeid renvoie une référence à un objet const type_info, qui décrit le type déclaré du pointeur ou de la référence, et non l'objet auquel le pointeur ou la référence est attaché.
Par ailleurs, même si RTTI est désactivé, vous pouvez faire en sorte que toutes les instances d'une classe donnée et de toutes ses classes dérivées fournissent des identifications de type polymorphe à l'exécution (lorsque c'est nécessaire) en utilisant le mot clé __rtti dans la définition de la classe.
Lorsque l'identification de type à l'exécution est désactivée, si une classe de base est déclarée __rtti, alors toutes les classes de base polymorphes doivent aussi être déclarées __rtti.
struct __rtti S1 { virtual s1func(); }; /* Polymorphe */ struct __rtti S2 { virtual s2func(); }; /* Polymorphe */ struct X : S1, S2 { };
Si vous désactivez le mécanisme RTTI, il se pourrait que les informations de type ne soient plus disponibles pour les classes dérivées. Lorsqu'une classe est dérivée de plusieurs classes, le fait qu'elle hérite ou non du mécanisme RTTI dépend de l'ordre et du type des classes de base.
Lorsque vous avez des classes polymorphes et non polymorphes, l'ordre de l'héritage est important. Si vous compilez les déclarations suivantes sans RTTI, vous devez déclarer X avec le modificateur __rtti. Sinon, basculer l'ordre des classes de base de la classe X résulte en une erreur de compilation du type "Can't inherit non RTTI class from RTTI base 'S1'".
struct __rtti S1 { virtual func(); }; /* Classe polymorphe */ struct S2 { }; /* Classe non polymorphe */ struct __rtti X : S1, S2 { };
Remarque : La classe X est déclarée explicitement avec __rtti. Cela rend moins dangereux le mélange de l'ordre et des types des classes.
Dans l'exemple suivant, la classe X n'hérite que de classes non polymorphes. La classe X n'a donc pas besoin d'être déclarée __rtti.
struct __rtti S1 { }; // Classe non polymorphe struct S2 { }; struct X : S2, S1 { }; // L'ordre est sans importance
Ni le mot clé __rtti ni l'activation de RTTI ne transforme une classe statique en classe polymorphe.