In this example it uses polymorphysm via virtual, override keywords
 abstract class A
    {
        public virtual string Print() { return "A"; }
    }
    
    class B : A
    {
        public override string Print() { return "B"; }
    }
    
    class C : B
    {
        public virtual new string Print() { return "C"; }
    }
    
    class D : C
    {
        public override string Print() { return "D"; }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            A a = new D();
    
            Console.WriteLine(a.Print());
        }
    }
Console prints B. Why B, not D? Thank you for answers
 
     
    