Ви не вказали мову.
У C ++ конструктор повинен остерігатися виклику віртуальної функції, оскільки фактична функція, яку він викликає, - це реалізація класу. Якщо це чистий віртуальний метод без реалізації, це буде порушенням доступу.
Конструктор може викликати невіртуючі функції.
Якщо ваша мова - це Java, де функції за замовчуванням зазвичай є віртуальними, має сенс бути обережними.
Здається, C # вирішує ситуацію так, як ви очікували: ви можете викликати віртуальні методи в конструкторах, і це викликає останню версію. Так що в C # не є антидіаграмою.
Загальною причиною виклику методів від конструкторів є те, що у вас є кілька конструкторів, які хочуть викликати загальний метод "init".
Зауважте, що у деструкторів виникне та сама проблема з віртуальними методами, тому ви не можете мати віртуальний метод очищення, який сидить поза вашим деструктором, і очікуйте, що його викличе деструктор базового класу.
У Java та C # немає деструкторів, у них є фіналізатори. Я не знаю поведінки з Java.
Здається, що C # правильно справляється з очищенням з цього приводу.
(Зверніть увагу, що хоча Java та C # мають збір сміття, він управляє лише розподілом пам'яті. Існує інша очистка, яку повинен зробити ваш деструктор, не звільняючи пам'ять).