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 implementazione, si tratterà di una violazione di accesso.
Un costruttore può chiamare funzioni non virtuali.
Se la tua lingua è Java, dove le funzioni sono generalmente virtuali per impostazione predefinita, è logico che tu debba fare 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 si hanno più costruttori che vogliono chiamare un metodo "init" comune.
Nota che i distruttori avranno lo stesso problema con i metodi virtuali, quindi non puoi avere un metodo di "pulizia" virtuale che si trova al di fuori del tuo distruttore e ti aspetti che venga chiamato dal distruttore di classe base.
Java e C # non hanno distruttori, hanno finalizzatori. Non conosco il comportamento con Java.
A questo proposito, C # sembra gestire correttamente la pulizia.
(Si noti che sebbene Java e C # abbiano Garbage Collection, che gestisce solo l'allocazione di memoria. Esiste un altro clean-up che il distruttore deve fare che non sta rilasciando memoria).