En un solo ejemplo de código vamos a ver como crear herencia de una clase a otra, en este caso de la clase Dispositivo a la clase Movil. Aquí entrará en juego el polimorfismo, es decir, un mismo método en la clase hija y clase padre con distinto efecto. Merece la pena comentar que disponemos de clases abstractas y también de clases que NO se puede heredar (sealed). Vamos a ver:
/**
* Dispositivo.cs
* Superclase o clase padre para definir los dispositivos,
* de esta heredarán dispositivos más concretos como Ordenador, Móvil,..
*/

using System;

public class Dispositivo
{
	// Atributos, algunos con sus accesos set y get
	protected string nombre; // Protected: solo accesible para clases hijas
	private int anchura;     // Private: inaccesible para cualquier otra clase
	// Atributo con metodos set/get
	protected int altura
		{
				get { return altura; }
				set {	altura = value; }
		}
	double peso;
	int voltaje
		{
			get { return voltaje; }
			set { voltaje = value; }
		}

	// Constructor sin parámetros
	public Dispositivo ()
	{
		nombre = "Dispositivo";
		anchura = 40;
		altura = 50;
		peso = 1.5;
		voltaje = 12;

		System.Console.WriteLine("Dispositivo creado {0}", nombre);
	}

	// Constructor parametrizado
	public Dispositivo (string nombre, int voltaje)
	{
		this.nombre = nombre;
		anchura = 40;
		altura = 50;
		peso = 1.5;
		this.voltaje = voltaje;
	}

	// Método destuctor
	 ~Dispositivo()
	{
		System.Console.WriteLine("Dispositivo eliminado {0}", nombre);
	}

	// Muestra todo Por pantalla
	public void muestra()
	{
		System.Console.WriteLine("Nombre: {0}", nombre);
		System.Console.WriteLine("Anchura: {0}", anchura);
		System.Console.WriteLine("Altura: {0}", altura);
		System.Console.WriteLine("Peso: {0}", peso);
		System.Console.WriteLine("Voltaje: {0}", voltaje);
	}

	// Método VIRTUAL. Lo sobreescribimos en el hijo
	// Enciende el dispositivo
	public virtual void encender()
	{
		System.Console.WriteLine("Dispositivo {0} encendido", nombre);
	}

	// Método ABSTRACT. No se puede invocar el del padre,
	// pero si el que implementa el hijo. Para usarlo la
	// clase también debe ser abstracta: public abstract class Dispositivo
	// apagar. Apaga el dispositivo
	/*public abstract void apagar()
	{
		System.Console.WriteLine("Dispositivo {0} apagado", nombre);
	}*/

}


// Clase Movil, que hereda de la clase dispositivo
// por lo que se hace con sus atributos y métodos
public class Movil : Dispositivo
{
	// Metemos un atributo propio
	string marca;

	// Constructor, que invoca a la base
	public Movil() : base()
	{
			System.Console.WriteLine("Móvil creado {0}", nombre);
	}

	// Constructor, que invoca a la base
	public Movil(string nombre, int voltaje) : base(nombre, voltaje)
	{
			System.Console.WriteLine("Móvil creado {0}", nombre);
	}

	// Constructor, que invoca a la base en parte
	public Movil(string marca, string nombre, int voltaje) : base(nombre, voltaje)
	{
			this.marca = marca;
			System.Console.WriteLine("Móvil creado {0}", nombre);
	}

	// Llamada POLIMÓRFICA. Invoca el mismo método pero hace algo distinto
	// Hay que poner la palabra new para indicarlo!!!
	// toString : Muestra todo Por pantalla
	public new void muestra()
	{
		// Que haga lo mismo que la superclase...
		base.muestra();

		// .. y además
		System.Console.WriteLine("Marca: {0}", marca);
	}

	// Método VIRTUAL. Para asegurarnos que al invocar "encender"
	// se llama al hijo y no al padre debemos meter la palabra override
	public override void encender ()
	{
		System.Console.WriteLine("Movil {0} encendido", marca);
	}

	// Metodo principal
	public static void Main ()
	{
			Movil tiemensA35i = new Movil();
			Movil noki45210 = new Movil("Noki45210", 12);
			Movil amotorola = new Movil("Amotorola", 9);
			Dispositivo generico = new Dispositivo();

			tiemensA35i.muestra();
			noki45210.muestra();

			System.Console.WriteLine("Tipo generico {0}", generico.GetType());

			// OPERADOR IS: sirve para comprobar el tipo de una clase
			if (noki45210 is Movil)
			{
				// Efectivamente, es un movil
				System.Console.WriteLine("Tipo noki {0}", noki45210.GetType());
			}

			System.Console.WriteLine("Altura Nokia: {0}", noki45210.altura);

			// Encendemos el movil
			amotorola.encender();

			// Encendemos el dispositivo
			generico.encender();

			// Sacamos sus datos...
			amotorola.ToString();

	}
}

// SEALED: una clase de la que nadie puede heredar
// Clase Marca
public sealed class Marca
{
	public static string[] marca  = new string[3]{"TIEMENS","BENG","LGE"};
}