Vous n'avez pas spécifié de langue.
En C ++, un constructeur doit se méfier lors de l'appel d'une fonction virtuelle, dans la mesure où la fonction réelle qu'il appelle est l'implémentation de classe. S'il s'agit d'une méthode virtuelle pure sans implémentation, ce sera une violation d'accès.
Un constructeur peut appeler des fonctions non virtuelles.
Si votre langage est Java où les fonctions sont généralement virtuelles par défaut, il est logique que vous deviez faire très attention.
C # semble gérer la situation comme vous vous y attendez: vous pouvez appeler des méthodes virtuelles dans les constructeurs et il appelle la version la plus finale. Donc en C # pas un anti-pattern.
Une raison courante pour appeler des méthodes à partir de constructeurs est que plusieurs constructeurs souhaitent appeler une méthode "init" commune.
Notez que les destructeurs auront le même problème avec les méthodes virtuelles, donc vous ne pouvez pas avoir une méthode de "nettoyage" virtuelle qui se trouve à l'extérieur de votre destructeur et vous attendre à ce qu'elle soit appelée par le destructeur de classe de base.
Java et C # n'ont pas de destructeurs, ils ont des finaliseurs. Je ne connais pas le comportement avec Java.
C # semble gérer correctement le nettoyage à cet égard.
(Notez que bien que Java et C # aient une récupération de place, cela ne gère que l'allocation de mémoire. Il y a un autre nettoyage dont votre destructeur a besoin pour faire qui ne libère pas de mémoire).