__rtti und die Option -RT

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Schlüsselwörter alphabetisch - Index

Hinweis: Das Schlüsselwort __rtti ist nur für den klassischen bcc32-Compiler, nicht für den modernen durch Clang erweiterten Compiler verfügbar.

Kategorie des Schlüsselwortes __rtti

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

Beschreibung

Die Laufzeittypidentifikation (RTTI) ist standardmäßig aktiviert. Auf der Seite "C++" des Dialogfelds "Projektoptionen" können Sie RTTI deaktivieren. Verwenden Sie in der Befehlszeile 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 nicht polymorphe Klasse ist, dann gibt typeid eine Referenz auf ein const type_info-Objekt zurück, das den deklarierten Typ des Zeigers bzw. der Referenz beschreibt, und nicht das tatsächliche Objekt, an das der Zeiger oder die Referenz gebunden ist.

Darüber hinaus können Sie, auch wenn RTTI deaktiviert ist, alle Instanzen einer bestimmten Klasse und alle von dieser Klasse abgeleiteten Klassen dazu zwingen, eine polymorphe Laufzeittypidentifikation (wo angemessen) bereitzustellen, indem Sie das Schlüsselwort __rtti in der Klassendefinition angeben.

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

struct __rtti S1 { virtual s1func(); };  /* Polymorphic */
struct __rtti S2 { virtual s2func(); };  /* Polymorphic */
struct X : S1, S2 { };

Wenn Sie den RTTI-Mechanismus deaktivieren, dann sind für abgeleitete Klassen möglicherweise keine Typinformationen 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-Fähigkeit 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. Andernfalls führt eine Veränderung der Reihenfolge der Basisklassen von X zu der Compiler-Fehlermeldung "RTTI-Klasse kann nicht von Nicht-RTTI-Basis 'S1' abgeleitet werden".

struct __rtti S1 { virtual func(); };   /* Polymorphic class */
struct S2 { };                           /*  Non-polymorphic class */
struct __rtti X : S1, S2 { };
Hinweis: 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 nicht polymorphen Klassen. Die Klasse X muss nicht mit __rtti deklariert sein.

struct __rtti S1 {  };   // Non-polymorphic class
struct S2 { };
struct X : S2, S1 { };   // The order is not essential

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

Siehe auch