Anda belum menentukan bahasa.
Dalam C ++ seorang konstruktor harus waspada ketika memanggil fungsi virtual, karena fungsi sebenarnya yang dipanggil adalah implementasi kelas. Jika ini adalah metode virtual murni tanpa implementasi, ini akan menjadi pelanggaran akses.
Konstruktor dapat memanggil fungsi non-virtual.
Jika bahasa Anda adalah Java di mana fungsi umumnya virtual secara default masuk akal bahwa Anda harus ekstra hati-hati.
C # tampaknya menangani situasi seperti yang Anda harapkan: Anda dapat memanggil metode virtual dalam konstruktor dan itu memanggil versi paling final. Jadi di C # bukan anti-pola.
Alasan umum untuk memanggil metode dari konstruktor adalah Anda memiliki beberapa konstruktor yang ingin memanggil metode "init" yang umum.
Perhatikan bahwa destruktor akan memiliki masalah yang sama dengan metode virtual, sehingga Anda tidak dapat memiliki metode "pembersihan" virtual yang berada di luar destruktor Anda dan mengharapkannya dipanggil oleh destructor kelas dasar.
Java dan C # tidak memiliki destruktor, mereka memiliki finalizer. Saya tidak tahu perilaku dengan Java.
C # tampaknya menangani pembersihan dengan benar terkait hal ini.
(Perhatikan bahwa walaupun Java dan C # memiliki pengumpulan sampah, itu hanya mengelola alokasi memori. Ada pembersihan lain yang perlu dilakukan destruktor Anda yang tidak melepaskan memori).