Können Sie einen Klassenkonstruktor überschreiben und geerbt verwenden?

7

Wenn Sie einen Klassenkonstruktor in einer Basisklasse definieren (dh eine statische Klassenvariable setzen), ist es möglich, diesen Klassenkonstruktor in einer abgeleiteten Klasse zu überschreiben und den Konstruktor von seinem hierarchischen Elternteil mit geerbt ?

Beispiel:

%Vor%     
Bascy 18.06.2012, 14:26
quelle

2 Antworten

16

Es gibt keinen Grund für Klassenkonstruktoren , virtuell zu sein, da sie nicht polymorph aufgerufen werden können. Sie können sie nicht direkt anrufen; Je nachdem, welche Klassen in einem Programm verwendet werden, fügt der Compiler automatisch Aufrufe an sie ein. Virtuelle Methoden dienen zur Laufzeitpolymorphie, aber da der Compiler genau weiß, welche Klassenkonstruktoren er zur Kompilierungszeit aufruft, ist kein dynamischer Dispatch für Klassenkonstruktoren oder Destruktoren erforderlich.

Virtuelle Methoden sind jedoch für die Vererbung nicht erforderlich, daher sollte es kein Problem geben, inherited in einem Klassenkonstruktor oder Klassendestruktor zu verwenden. Wie Davids Antwort darauf hinweist, ignoriert der Compiler Aufrufe von inherited , da es in der Regel unklug ist, eine Klasse mehrmals zu initialisieren , was Sie tun würden, wenn Sie wirklich den geerbten Klassenkonstruktor aufrufen würden. Wenn es etwas gibt, was du zweimal tun musst, musst du einen anderen Weg finden, um es umzusetzen.

    
Rob Kennedy 18.06.2012, 14:38
quelle
9

Da Klassenkonstruktoren nicht virtuell sein können (es ist nicht sinnvoll, dass sie virtuell sind), müssen Sie zuerst die Schlüsselwörter virtual und override entfernen, damit der Code kompiliert werden kann.

Klassenkonstruktoren werden normalerweise zum Initialisieren von Klassenvariablen verwendet. Klassenvariablen müssen typischerweise einmal und nur einmal initialisiert werden. Wenn Sie inherited so aufrufen könnten, wie Sie es in der Frage vorgeschlagen haben, wird TBaseClass.ClassCreate mehrmals aufgerufen, obwohl es genau einmal aufgerufen werden muss.

Während Sie inherited in einen Klassenkonstruktor schreiben können und der Code kompiliert wird, ignoriert der Compiler ihn einfach.

%Vor%

Beachten Sie, dass beide Klassenkonstruktoren natürlich ausgeführt werden.

    
David Heffernan 18.06.2012 14:39
quelle

Tags und Links