Sie haben keine Sprache angegeben.
In C ++ muss ein Konstruktor beim Aufrufen einer virtuellen Funktion aufpassen, dass die eigentliche Funktion, die er aufruft, die Klassenimplementierung ist. Wenn es sich um eine rein virtuelle Methode ohne Implementierung handelt, liegt eine Zugriffsverletzung vor.
Ein Konstruktor kann nicht virtuelle Funktionen aufrufen.
Wenn Ihre Sprache Java ist und die Funktionen standardmäßig virtuell sind, ist es sinnvoll, besonders vorsichtig zu sein.
C # scheint die Situation so zu handhaben, wie Sie es erwarten würden: Sie können virtuelle Methoden in Konstruktoren aufrufen und es ruft die endgültigste Version auf. Also in C # kein Anti-Pattern.
Ein häufiger Grund für den Aufruf von Methoden aus Konstruktoren besteht darin, dass mehrere Konstruktoren eine gemeinsame "init" -Methode aufrufen möchten.
Beachten Sie, dass Destruktoren dasselbe Problem mit virtuellen Methoden haben. Daher können Sie keine virtuelle "Aufräum" -Methode verwenden, die sich außerhalb Ihres Destruktors befindet und erwartet, dass sie vom Destruktor der Basisklasse aufgerufen wird.
Java und C # haben keine Destruktoren, sondern Finalizer. Ich kenne das Verhalten mit Java nicht.
C # scheint die Bereinigung in dieser Hinsicht korrekt zu handhaben.
(Beachten Sie, dass Java und C # zwar eine Garbage Collection haben, aber nur die Speicherzuordnung verwalten. Es gibt eine andere Bereinigung, die Ihr Destruktor durchführen muss, ohne Speicher freizugeben.)