No ha especificado un idioma.
En C ++, un constructor debe tener cuidado al llamar a una función virtual, ya que la función real a la que llama es la implementación de la clase. Si es un método virtual puro sin una implementación, esto será una violación de acceso.
Un constructor puede llamar a funciones no virtuales.
Si su lenguaje es Java, donde las funciones son generalmente virtuales de manera predeterminada, tiene sentido que tenga que tener mucho cuidado.
C # parece manejar la situación de la manera que cabría esperar: puede llamar a métodos virtuales en constructores y llama a la versión más final. Entonces, en C # no es un antipatrón.
Una razón común para llamar a métodos desde constructores es que tiene múltiples constructores que desean llamar a un método "init" común.
Tenga en cuenta que los destructores tendrán el mismo problema con los métodos virtuales, por lo tanto, no puede tener un método de "limpieza" virtual que se encuentre fuera de su destructor y espere que sea llamado por el destructor de clase base.
Java y C # no tienen destructores, tienen finalizadores. No sé el comportamiento con Java.
C # parece manejar la limpieza correctamente a este respecto.
(Tenga en cuenta que aunque Java y C # tienen recolección de basura, eso solo administra la asignación de memoria. Hay otra limpieza que su destructor necesita hacer que no libera memoria).