Cuando un objeto se lanza a una clase base, ¿cómo recuerda lo que realmente es?

Esta es una pregunta para principiantes, pero estoy interesado en aprender lo que está sucediendo aquí. Mi pregunta es, ¿qué sucede detrás de escena cuando lanzas un objeto? ¿Mantiene algún tipo de metadatos sobre lo que originalmente era? Esto es lo que quiero decir:

Supongamos que tengo un método llamado "ClockIn" que acepta un parámetro de tipo "Empleado":

public static void ClockIn(Employee employee)
{
   var manager = employee as Manager;
   if (manager != null)
   {
      manager.OpenSafe();
   }
}

Por lo tanto, suponga que Manager es una subclase del tipo Empleado y que tiene el método "OpenSafe":

public class Manager : Employee 
{
   public void OpenSafe()
   { 
      ... 
   }
}

El método "ClockIn", si encuentra que se ha pasado un Administrador, llama al método OpenSafe. Como:

var bob = new Manager();
ClockIn(bob);

Aquí, pasé una instancia de tipo Manager a un método que acepta la clase base Empleado. Necesito enviar la instancia dentro del método ClockIn al Administrador antes de poder llamar a OpenSafe.

La pregunta es, ¿hay algunos metadatos que recuerden que "bob" es un gerente, a pesar de que lo he pasado como empleado? ¿Cómo sabe el código que puede ser enviado a un gerente? ¿Hay algo en el montón?

Respuestas a la pregunta(5)

Su respuesta a la pregunta