Я считал, что виртуализация не работает в конструкторе суперкласса в соответствии с дизайном ООП. Например, рассмотрим следующий код C#.Виртуализация в Super Class Constructor
using System;
namespace Problem
{
public class BaseClass
{
public BaseClass()
{
Console.WriteLine("Hello, World!");
this.PrintRandom();
}
public virtual void PrintRandom()
{
Console.WriteLine("0");
}
}
public class Descendent : BaseClass
{
private Random randomValue;
public Descendent()
{
Console.WriteLine("Bonjour, Monde!");
randomValue = new Random();
}
public override void PrintRandom()
{
Console.WriteLine(randomValue.NextDouble().ToString());
}
public static void Main()
{
Descendent obj = new Descendent();
obj.PrintRandom();
Console.ReadLine();
}
}
}
Этот код брейков, потому что, когда объект потомка производится, он вызывает конструктор базового класса, и у нас есть виртуальный вызов метода в конструктор базового класса, который в свою очередь, вызывает метод производного класса и, следовательно, он выходит из строя, так как К этому времени randomValue не инициализируется.
Аналогичный код работает в C++, так как вызов PrintRandom не направляется в производном классе, так как ИМО, порядок в C++ это что-то вроде:
1. вызов для конструктора базового класса
2. Обновление V - Таблица для этого класса
3. вызова код конструктора
Мой вопрос заключается в том, что я, во-первых ли я прав, что в соответствии с принципами объектно-ориентированного программирования, виртуализация не должна/не работает в конструктор класса супер и, во-вторых, если Я прав, то почему поведение отличается на всех языках .NET (у меня есть тест ed с C#, VB.NET и MC++)