TStrings =class(TPersistent) private ... protected ... public constructor Create; ...
Die Klasse TStringList ist von TStrings abgeleitet, und erbt den Constructor. Im Zuge der Änderungen würde ich gerne den geerbten Constructor überschreiben:
Der letztendlich von TObject geerbte Constructor ist nicht virtuell, daher ist der Zusatz "override" fehl am Platz. Erst ab TComponent gibt es einen virtuellen Constructor.
Tut mir leid, jetzt ist Zeit für eine Pause. Der Fehler war ein ganz anderer. Ich hatte den Constructor schon einmal geschrieben, jetzt etwas weiter vorne im Code ein zweites mal. Hat natürlich eine Fehlermeldung gegeben, und ich habe gemeint, es würde an einem fehlenden override liegen, das er dann aber natürlich auch beanstandet hat.
Einen nicht virtuellen Konstruktur musst du nicht überschreiben. Das macht auch absolut keinen Sinn. Kurze Erklärung wie virtual und override funktionieren und warum es unsinn ist einen nicht virutellen Konstruktor zu überschreiben. Virtuelle funktionen stehen im Objekt das man erzeugt in der so genannten virtual function table (vtable). Wenn diese Funktion aufgerufen wird schaut der PC im der vtable nach wo die funktion liegt und springt dort hin. Wenn man nun eine override funktion definiert, überschreibt den eintrag für die Funktion in der vtable, sodass statt der original funktion die abgeleitete Funktion aufgerufen wird, egal ob an dieser stelle bekannt ist um was für ein Objekt es sich handelt. Sagen wir Klasse TFoo hat die virtuelle Methode FooBar, mit grundfunktionalität. Klasse TBar erbt von TFoo und möchte nun spezielle Funktionalität implementieren überschreibt also FooBar. Wenn jetzt irgendwo Foo.FooBar(); (Foo: TFoo) denkt der Compiler zwar das es sich um ein Objekt des Typs TFoo handelt, und würde ohne virtual einfach TFoo.FooBar aufrufen, aber weil es virtual ist, wird der Umweg über die vtable gemacht, wo die Klasste TBar ihre eigene funktion reingeschrieben hat, und so wird TBar.FooBar ausgeführt.
Damit das ganze funktionieren kann, verspricht man mit dem Virtual Keyword, das alle überschreibenden Funktionen die Selbe Signatur (Rückgabewert und Parameter) haben, also identisch aufgerufen werden können.
So setzt man z.B. konstruktoren virtuell um zu garantieren das der Korrekte konstruktor auf jeden fall ausgeführt werden muss. Ansonsten macht override bei einem Konstruktor aber keinen sinn, der Konstruktor erzeugt das Objekt, es gibt vorher das Objekt also noch nicht, damit gibt es auch noch keine vtable, weshalb überschreiben im ursprünglichen Sinne nicht mal funktioniert. Du kannst nicht über eine der Vaterklassen den Konstruktor einer Kindsklasse aufrufen, das ist technisch nicht möglich, da man immer den Konstruktor der aktuellen klasse aufrufen muss. Daher ist der einzige Grund konstruktoren zu überladen, um sicher zu gehen die richtige Signatur für den Konstruktor verwendet wird.
Langer rede kurzer Sinn, verwende kein override, es macht für dich keinen Sinn
Danke für die ausführliche Erklärung, im Prinzip war mir das Ganze schon klar, und ich hatte auch ursprünglich weder virtual noch override verwendet. Nachdem ich eine Fehlermeldung bekommen habe, die mich irgendwie dazu gebracht hat, zu glauben, der Compiler will hier ein override haben - war natürlich Unsinn - habe ich es so versucht, und bei der neuerlichen Fehlermeldung (es geht also weder mit noch ohne override - was nun?) war dann irgendwie Kurzschluss. An die Möglichkeit, dass ich den Konstruktor ohnehin schon geschrieben haben könnte und der Code jetzt zwei mal da steht, habe ich überhaupt nicht gedacht.
Ich sollte mir angewöhnen, in solchen Situationen einfach eine kurze Pause zu machen und das Ganze danach noch einmal in aller Ruhe anzuschauen...