__rtti und die Option -RT

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Schlüsselwörter alphabetisch - Index


Kategorie des Schlüsselwortes __rtti

Modifizierer, Schlüsselwort-Erweiterungen, C++-spezifische Schlüsselwörter

Beschreibung

Die Laufzeittypidentifikation (RTTI) ist in der Voreinstellung aktiviert. Auf der Registerseite C++ des Dialogfeldes Projektoptionen können Sie RTTI deaktivieren. Verwenden Sie in der Kommandozeile die Option -RT-, um RTTI zu deaktivieren oder -RT, um es zu aktivieren.

Wenn RTTI nicht aktiviert ist oder wenn das Argument von typeid ein Zeiger oder eine Referenz auf eine nichtpolymorphe Klasse ist, so liefert typeid eine Referenz auf ein Objekt vom Typ const type_info zurück, das den deklarierten Typ des Zeigers bzw. der Referenz selbst beschreibt, aber nicht den des aktuellen Objektes, auf das der Zeiger bzw. die Referenz weist.

Außerdem können Sie sogar dann, wenn RTTI nicht aktiviert ist, bestimmen, dass alle Instanzen einer bestimmten Klasse und aller von dieser abgeleiteten Klassen polymorphe Laufzeit-Typinformationen (soweit sinnvoll) liefern, indem Sie das Schlüsselwort __rtti in der Klassendefinition benutzen.

Wenn Sie die die Laufzeittypidentifikation deaktivieren und dabei irgendeine Basisklasse mit __rtti deklariert ist, so müssen alle polymorphen Basisklassen ebenfalls mit __rtti deklariert sein.

struct __rtti S1 { virtual s1funk(); };  /* Polymorph */
struct __rtti S2 { virtual s2funk(); };  /* Polymorph */
struct X : S1, S2 { };

Wenn Sie den RTTI-Mechanismus deaktivieren, so sind für abgeleitete Klassen möglicherweise keine RTTI-Informationen verfügbar. Wenn eine Klasse von mehreren Klassen abgeleitet ist, so hängt es von Reihenfolge und Typ der Basisklassen ab, ob die Klasse die RTTI-Möglichkeit erbt oder nicht.

Wenn Sie gleichzeitig mit polymorphen und nicht-polymorphen Klassen arbeiten, wird die Reihenfolge der Vererbung wichtig. Wenn Sie die folgenden Deklarationen ohne RTTI compilieren, sollten Sie X mit dem Modifizierer __rtti deklarieren. Versäumen Sie dies, so führt eine Veränderung der Reihenfolge der Basisklassen von X zu der Compiler-Fehlermeldung Can't inherit non-RTTI class from RTTI base 'S1' (Kann keine Nicht-RTTI-Klassen von der RTTI-Basis "S1" erben).

struct __rtti S1 { virtual funk(); };   /* Polymorphe Klasse */
struct S2 { };                           /* Nichtpolymorphe Klasse */
struct __rtti X : S1, S2 { };

Anmerkung:  Die Klasse X wird explizit mit __rtti deklariert. Dadurch wird sichergestellt, dass Reihenfolge und Typ der Klassen problemlos verändert werden können.

Im folgenden Beispiel erbt die Klasse X nur die nichtpolymorphen Klassen. Die Klasse X muss nicht __rtti-deklariert sein.

struct __rtti S1 {  };   // Nichtpolymorphe Klasse
struct S2 { };
struct X : S2, S1 { };   // Die Reihenfolge ist ohne Bedeutung

Weder die Verwendung des Schlüsselworts __rtti noch die Aktivierung von RTTI, macht eine statische Klasse zu einer polymorphen Klasse.

Siehe auch