https://pt.stackoverflow.com/q/151243/101

CSharp · Console

/Program.cs

using static System.Console;
					
public class Program {
	public static void Main() {
		Veiculo a = new Carro();
		a.Andar(); //imprime Carro, mesmo que x seja do tipo Veiculo
		Carro b = new Carro();
		b.Andar(); //imprime Carro, claro, isso é fácil deduzir
		Veiculo c = new Veiculo();
		c.Andar(); //imprime Veiculo, é óbvio
		Carro2 d = new Carro2();
		d.Andar(); //óbvio que imprime Carro
		Veiculo e = new Carro2(); //aqui só esconde, não faz polimorfismo, a instância não importa
		e.Andar(); //aqui imprime Veiculo, afinal o tipo da variável é dessa classe
		Carro3 f = new Carro3();
		f.Andar(); //funciona igual, nenhuma confusão
		Veiculo g = new Carro3(); //pode estar esperando polimorfismo que não ocorrerá
		g.Andar(); //funciona igual, mas poderia não ser o que deseja
		Carro4 h = new Carro4();
		h.Andar(); //funciona igual, nenhuma confusão
		Veiculo2 i = new Carro4(); //pode estar esperando polimorfismo que não ocorrerá
		i.Andar(); //funciona igual, mas poderia não ser o que deseja
	}
}
public class Veiculo {
    public virtual void Andar() => WriteLine("Veiculo");
}
public class Carro : Veiculo {
    public override void Andar() => WriteLine("Carro");
}
public class Carro2 : Veiculo {
    public new void Andar() => WriteLine("Carro");
}
public class Carro3 : Veiculo {
    public void Andar() => WriteLine("Carro"); //note o warning
}
public class Veiculo2 {
    public void Andar() => WriteLine("Veiculo");
}
public class Carro4 : Veiculo2 {
    public void Andar() => WriteLine("Carro"); //note o warning
}
;