Nie określiłeś języka.
W C ++ konstruktor musi uważać podczas wywoływania funkcji wirtualnej, ponieważ rzeczywista funkcja, którą wywołuje, jest implementacją klasy. Jeśli jest to czysto wirtualna metoda bez implementacji, będzie to naruszenie zasad dostępu.
Konstruktor może wywoływać funkcje inne niż wirtualne.
Jeśli Twoim językiem jest Java, w którym funkcje są domyślnie wirtualne, warto zachować szczególną ostrożność.
Wydaje się, że C # radzi sobie z sytuacją tak, jak byś się spodziewał: możesz wywoływać metody wirtualne w konstruktorach i wywołuje najbardziej ostateczną wersję. Więc w C # nie jest anty-wzorem.
Częstym powodem wywoływania metod z konstruktorów jest to, że masz wielu konstruktorów, którzy chcą wywołać wspólną metodę „init”.
Zauważ, że destruktory będą miały ten sam problem z metodami wirtualnymi, dlatego nie możesz mieć wirtualnej metody „czyszczenia”, która znajduje się poza twoim destruktorem i oczekujesz, że zostanie wywołany przez destruktor klasy podstawowej.
Java i C # nie mają destruktorów, mają finalizatory. Nie znam zachowania w Javie.
Wygląda na to, że C # poprawnie obsługuje czyszczenie.
(Zauważ, że chociaż Java i C # mają funkcje odśmiecania pamięci, to tylko zarządza alokacją pamięci. Istnieje jeszcze inne czyszczenie, które musi wykonać Twój destruktor, ale nie zwalnia ono pamięci).