Il polimorfismo è una delle tre caratteristiche della programmazione
ad oggetti (OOP).
Il polimorfismo è la funzionalità che permette di utilizzare un'unica interfaccia per un'intera classe di azioni.
Insieme all'ereditarietà è uno dei punti di forza del framework.NET.

Ecco come implementarlo in C# con una classe astratta:
codice:
using System;

/// <summary>
/// Prova di virtual e override
/// </summary>

public abstract class Animale  {/* ecco la superclasse */
	public virtual void saluta(){
		Console.WriteLine("Ciao, sono un animale\n");
	}
}

public class Cane:Animale {/* ecco la derivata */
	public override void saluta() {
		Console.WriteLine("Ciao, sono un cane\n");
	}
	
}

public class Gatto:Animale {/* ecco la derivata */
	public override void saluta() {
		Console.WriteLine("Ciao, sono un gatto\n");
	}
	
}

public class Test {
	public static void Main() {
    	Cane bau = new Cane();
	Gatto miao = new Gatto();
	bau.saluta();
	miao.saluta();	
	}
	
}
Analizzando le classi abiamo:

* la classe Animale , contrassegnata da abstract che è la nostra superclasse base
* la classe Cane derivata da Animnale
* la classe Gatto derivata da Animale

Analizzando le funzioni abbiamo:
* la funzione saluta() di Animale contrassegnata da virtual
* la funzione saluta() di Cane contrassegnata da override
* la funzione saluta() di Gatto contrassegnata da override


Conclusione:

Le funzioni che noi dichiariamo dentro una classe astrata con la parola riservata virtual,
sono soggette a polimorfismo.
Questo è ottenuto reimplementando la stessa funzione della classe di base in una classe derivata e sostituendo virtual con override.

N.B-->La funzione ereditata e contrassegnata con override nn dovra combiare ne il tipo restituito ne gli argomentii