Вы не указали язык.
В C ++ конструктор должен быть осторожен при вызове виртуальной функции, так как фактическая функция, которую он вызывает, является реализацией класса. Если это чисто виртуальный метод без реализации, это будет нарушением прав доступа.
Конструктор может вызывать не виртуальные функции.
Если ваш язык - Java, где функции по умолчанию являются виртуальными, имеет смысл быть особенно осторожным.
C #, кажется, справляется с ситуацией так, как вы ожидаете: вы можете вызывать виртуальные методы в конструкторах, и это вызывает самую финальную версию. Так что в C # не анти-паттерн.
Распространенная причина вызова методов из конструкторов заключается в том, что у вас есть несколько конструкторов, которые хотят вызвать общий метод init.
Обратите внимание, что деструкторы будут иметь ту же проблему с виртуальными методами, поэтому вы не можете иметь виртуальный метод «очистки», который находится вне вашего деструктора и ожидать, что он будет вызван деструктором базового класса.
У Java и C # нет деструкторов, у них есть финализаторы. Я не знаю поведение с Java.
C #, кажется, справляется с очисткой правильно в этом отношении.
(Обратите внимание, что, хотя Java и C # имеют сборку мусора, она управляет только распределением памяти. Есть другая очистка, которую должен сделать ваш деструктор, которая не освобождает память).