Herencia en c# y polimorfismo

 class Persona
    {
        private string _nombre;

        public Persona(string nombre)
        {
            Console.WriteLine("Constructor persona " + nombre);
            this.Nombre = nombre;
        }
        public string Nombre
        {
            set { this._nombre = value; }
            get { return this._nombre; }
        }
        public virtual string saludo()
        {
            return "Hola "+Nombre+" que tal";
        }

    }

    class Empleado :Persona
    {
        public Empleado(string nombre) : base(nombre)
        {
            Console.WriteLine("Constructor empleado " + nombre);

            this.Cargo = "Empleado";
        }
        private string _cargo;
        public string Cargo {
            set { this._cargo = value; }
            get { return this._cargo; } }
        public override string saludo()
        {
            return "Hola empleado " + Nombre + " ¿Todo bien?";
        }

    }
    class Gerente : Empleado
    {
        public int Bono { get; set; }
        public Gerente(string nombre) : base(nombre)
        {
            Console.WriteLine("Constructor gerente " + nombre);

            this.Cargo = "Gerente";

        }
        public Gerente(string nombre, int bono) : this(nombre)
        {
            this.Bono = bono;

        }
        public override string saludo()
        {
            return "Hola Sr. " + Nombre + " ¿Desea alguna cosa?";
        }
    }
    sealed class Direccion : Gerente
    {
        public Direccion(string nombre) : base(nombre, 100) {
            Console.WriteLine("Constructor direccion " + nombre);
        }
        public override string saludo()
        {
            return "Buenos días Sr. " + Nombre + " Estamos a sus órdenes";
        }
    }

Ejemplo de uso:

  Persona[] plantilla = { new Persona("Eva"), new Empleado("Juan"),new Empleado("Ana"),
            new Gerente("Rosa"), new Gerente("Luis"), new Direccion("Laura")};
            foreach(Persona empleado in plantilla)
            {
                Console.WriteLine(empleado.saludo());
            }