Non hai specificato una lingua.
In C ++ un costruttore deve fare attenzione quando chiama una funzione virtuale, in quanto la funzione effettiva che sta chiamando è l'implementazione della classe. Se si tratta di un metodo virtuale puro senza un'implementazione, questa sarà una violazione di accesso.
Un costruttore può chiamare funzioni non virtuali.
Se la tua lingua è Java, in cui le funzioni sono generalmente virtuali per impostazione predefinita, è logico che tu debba prestare molta attenzione.
C # sembra gestire la situazione come ti aspetteresti: puoi chiamare metodi virtuali nei costruttori e chiama la versione più definitiva. Quindi in C # non è un anti-pattern.
Un motivo comune per chiamare i metodi dai costruttori è che hai più costruttori che vogliono chiamare un metodo "init" comune.
Si noti che i distruttori avranno lo stesso problema con i metodi virtuali, quindi non si può avere un metodo di "pulizia" virtuale che si trova all'esterno del distruttore e si aspetta che venga chiamato dal distruttore della classe base.
Java e C # non hanno distruttori, hanno i finalizzatori. Non conosco il comportamento con Java.
C # sembra gestire correttamente il clean-up a questo proposito.
(Si noti che sebbene Java e C # dispongano della garbage collection, che gestisce solo l'allocazione della memoria.) Ci sono altri ripulimenti che il distruttore deve fare per non rilasciare memoria).