von Warf » 18. Dez 2018, 18:18 Re: override create geht nicht
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