AC # объект полностью построен и инициализирован в ноль перед запуском первого конструктора.Базовый конструктор будет вызывать производную реализацию виртуального метода.
Это считается плохим стилем для этого, поскольку производная реализация может вести себя странно, когда конструктор производного класса еще не был вызван.Но поведение само по себе хорошо определено.Если вы ничего не сделаете в производной реализации, которая требует, чтобы код из конструктора уже был запущен, он будет работать.
Вы можете представить, что среда выполнения сначала вызывает самый производный конструктор.И его первым действием является неявный вызов базового конструктора.Я не уверен, реализован ли он на самом деле таким образом, но поскольку некоторые языки .net позволяют вызывать базовый конструктор в произвольной точке производного конструктора, я ожидаю, что C # просто вызовет конструктор базового класса в качестве первого действия производногоКонструктор.
Это поведение сильно отличается от того, как C ++ обрабатывает его.В C ++ производные классы конструируются один за другим, и до запуска конструктора производного класса объект по-прежнему имеет тип базового класса, и переопределения из производного класса игнорируются.