Objekterstellung für die C++Builder-Bibliotheken

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu C++- und Object Pascal-Modelle


C++Builder und Delphi erstellen Objekte unterschiedlich. Dieser Abschnitt enthält einen Überblick über dieses Thema und eine Beschreibung, wie C++Builder diese beiden Vorgehensweisen kombiniert.

C++-Objekterstellung

Im Standard-C++ ist die Reihenfolge der Erstellung folgende: virtuelle Basisklassen, Basisklassen und schließlich abgeleitete Klasse. Die C++-Syntax verwendet die Liste der Initialisierungskonstruktoren für den Aufruf der Basisklassenkonstruktoren. Der Laufzeittyp des Objekts ist derjenige der Klasse des aktuellen Konstruktors, der aufgerufen wird. Die Bindung virtueller Methoden entspricht dem Laufzeittyp des Objekts und ändert sich folglich während der Erstellung.


Delphi-Objekterstellung

In Delphi ist nur gewährleistet, dass der Konstruktor für die instantiierte Klasse aufgerufen wird; der Arbeitsspeicher für Basisklassen wird jedoch zugewiesen. Die Erstellung aller unmittelbaren Basisklassen wird durch Aufrufen von inherited im jeweiligen Konstruktor der abgeleiteten Klasse durchgeführt. Per Konvention verwenden Klassen in VCL-, RTL- und FireMonkey-Bibliotheken inherited, um (nicht leere) Basisklassenkonstruktoren aufzurufen. Das ist jedoch kein Erfordernis der Sprache, sondern nur eine Konvention. Der Laufzeittyp des Objekts wird unmittelbar als Typ der instantiierten Klasse eingerichtet und ändert sich nicht, wenn Basisklassenkonstruktoren aufgerufen werden. Die Bindung virtueller Methoden entspricht dem Laufzeittyp des Objekts und ändert sich deshalb während der Erstellung nicht.

C++Builder-Objekterstellung

Objekte im Delphi-Stil werden wie Object Pascal-Objekte, aber mit der C++-Syntax erstellt. Das Vorgehen und die Reihenfolge des Aufrufs von Basisklassenkonstruktoren folgen also der C++-Syntax, wobei die Initialisierungsliste für alle Nicht-VCL-, Nicht-RTL, Nicht-FireMonkey-Basisklassen und der erste direkte VCL-RTL-FireMonkey-Vorfahre verwendet wird. Diese VCL-RTL-FireMonkey-Basisklasse ist die erste Klasse, die erstellt wird. Sie erstellt ihre eigene Basisklasse und verwendet dabei optional gemäß dem Object Pascal-Vorgehen inherited. Aus diesem Grund werden die VCL-RTL-FireMonkey-Basisklassen in der entgegengesetzten Reihenfolge erstellt, als Sie bei C++ erwarten würden. Anschließend werden alle C++-Basisklassen erstellt, vom am weitesten entfernten Vorfahr bis zur abgeleiteten Klasse. Der Laufzeittyp des Objekts und die Bindung virtueller Methoden basieren auf Object Pascal.


Die folgende Abbildung zeigt die Erstellung einer Instanz einer Klasse im Delphi-Stil, MyDerived, die von MyBase abgeleitet ist, die wiederum ein direkter Nachkomme von TWinControl ist. MyDerived und MyBase sind in C++ implementiert. TWinControl ist eine VCL-Klasse, die in Object Pascal implementiert ist.

Order of Construction.png

Vererbungsreihenfolge der Erstellung

Hinweis: Die Erstellungsreihenfolge mag C++-Programmierern verkehrt herum vorkommen, weil sie bei echten VCL-RTL-FireMonkey-Klassen mit dem äußersten Blatt (TWinControl) beginnt und mit TObject endet, dann MyBase und schließlich die abgeleitete Klasse erstellt.

Hinweis: TComponent ruft inherited nicht auf, weil TPersistent keinen Konstruktor hat. TObject hat einen leeren Konstruktor, daher wird er nicht aufgerufen. Würden diese Klassenkonstruktoren aufgerufen, würde die Reihenfolge dem Diagramm entsprechen, in dem diese Klassen abgedunkelt dargestellt sind.

Die folgende Tabelle gibt einen Überblick über die Modelle der Objekterstellung in C++, Object Pascal und C++Builder:


Vergleich der Objektmodelle

C++ Object Pascal C++Builder
Erstellungsreihenfolge

Virtuelle Basisklassen, dann Basisklassen, zuletzt die abgeleitete Klasse.

Der instantiierte Klassenkonstruktor ist der erste und einzige Konstruktor, der automatisch aufgerufen wird. Wenn nachfolgende Klassen erstellt werden, werden sie vom äußersten Blatt zum Stamm hin erstellt.

Unmittelbarste VCL-RTL-FireMonkey-Basisklasse, dann folgt die Erstellung dem Object Pascal-Modell und schließlich dem C++-Modell (außer, dass virtuelle Basisklassen nicht zulässig sind).

Vorgehen beim Aufrufen von Basisklassenkonstruktoren

Automatisch aus der Konstruktorinitialisierungsliste.

Optional, explizit und zur jeder Zeit im Rumpf des abgeleiteten Klassenkonstruktors mit dem Schlüsselwort inherited.

Automatisch aus der Konstruktorinitialisierungsliste durch den unmittelbarsten Vorfahren, der ein VCL-RTL-FireMonkey-Basisklassenkonstruktor ist. Dann gemäß Object Pascal durch Aufrufen von Konstruktoren mit inherited.

Laufzeittyp des Objekts, wie es erstellt wird

Ändert sich entsprechend dem Typ der aktuellen Konstruktorklasse.

Wird sofort als Typ der instantiierten Klasse eingerichtet.

Wird sofort als Typ der instantiierten Klasse eingerichtet.

Bindung virtueller Methoden

Ändert sich beim Aufruf der Basisklassenkonstruktoren entsprechend dem Laufzeittyp des Objekts.

Entspricht dem Laufzeittyp des Objekts. Bleibt bei den Aufrufen der Klassenkonstruktoren unverändert.

Entspricht dem Laufzeittyp des Objekts. Bleibt bei den Aufrufen der Klassenkonstruktoren unverändert.


Der Abschnitt Aufrufen virtueller Methoden in Konstruktoren für Basisklassen beschreibt die Bedeutung dieser Unterschiede.

Siehe auch