__declspec(delphiclass)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Schlüsselwörter alphabetisch - Index


Kategorie

Modifizierer, Schlüsselwort-Erweiterungen, Speicherklassenspezifizierer

Syntax

__declspec( delphiclass ) declarator

Beschreibung

Mit dem Argument delphiclass werden Klassen im Delphi-Stil deklariert. Solche Klassen werden mit der folgenden Kompatibilität erstellt:

  • Object Pascal-kompatible RTTI
  • Delphi-kompatible Exception-Behandlung
  • Delphi-kompatibles Konstruktor-/Destruktor-Verhalten
  • AfterConstruction und BeforeDestruction-Prozeduren (Code, der in regulären C++-Klassen in Konstruktoren bzw. Destruktoren gesetzt würde)

Für Klassen im Delphi-Stil gelten die folgenden Einschränkungen:

  • Virtuelle Basisklassen sind nicht zulässig.
  • Mehrfachvererbung ist nicht zulässig, außer für den unter Vererbung und Interfaces beschriebenen Fall.
  • Sie müssen dynamisch mit dem globalen Operator new erzeugt werden.
  • Instanzen im Delphi-Stil werden mit Null initialisiert, damit ihr Status vor Ausführung eines Konstruktors oder einer Methode definiert ist. Ohne dieses Vorgehen würde der Aufruf von Methoden vor Konstruktoren zu unvorhersehbaren Ergebnissen führen.
  • Kopierkonstruktoren und Zuweisungsoperatoren werden für abgeleitete Klassen im Delphi-Stil nicht vom Compiler erzeugt.
  • Eine aus Object Pascal übersetzte Forward-Klassendeklaration erfordert den Modifizierer delphiclass, wenn dem Compiler mitgeteilt werden muss, dass die Klasse im Delphi-Stil vorliegt. (Zum Beispiel, wenn die Klassen-ID oder andere RTTI-Informationen vor der Klassendefinition erforderlich sind.)

Weitere Anmerkungen:

  • Im Gegensatz zu regulären C++-Klassen können die Konstruktoren und Destruktoren von Basisklassen im Delphi-Stil virtuelle Methoden aufrufen und die "am weitesten abgeleiteten" Implementierungen ausführen. Auf diese Weise ist es möglich, dass eine Methode einer Klasse vor einem Konstruktor ausgeführt wird.

Beispiel

In dem folgenden Beispiel wird eine Klasse im Delphi-Stil mit einer Klassenmethode deklariert, die den Klassennamen zurückgibt.

#include <System.hpp>
#include <stdio.h>
#include <tchar.h>

class __declspec(delphiclass) TLock : public TObject {
public:
	virtual __classmethod UnicodeString GetClsName() {
		return this->ClassName();
	}
};

int _tmain(int argc, _TCHAR* argv[]) {
	printf("%ls", TLock::GetClsName().c_str()); // displays TLock
	return 0;
}

Siehe auch