Quando um objeto é convertido para uma classe base, como ele se lembra do que realmente é?

Esta é uma pergunta para iniciantes, mas estou interessado em aprender o que está acontecendo aqui. Minha pergunta é: o que acontece nos bastidores quando você rebaixa um objeto? Ele mantém algum tipo de metadado sobre o que era originalmente? Aqui está o que eu quero dizer:

Suponha que eu tenha um método chamado "ClockIn" que aceite um parâmetro do tipo "Employee":

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

Portanto, suponha que o gerente seja uma subclasse do tipo Employee e que tenha o método "OpenSafe":

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

O método "ClockIn", se achar que um gerente foi passado, chama o método OpenSafe. Tal como:

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

Aqui, eu passei uma instância do tipo Manager para um método que aceita a classe base Employee. Preciso converter a instância dentro do método ClockIn para o Manager antes de poder chamar o OpenSafe.

A questão é: existem alguns metadados que lembram que "bob" é um gerente, mesmo que eu tenha passado por ele como funcionário? Como o código sabe que ele pode realmente ser transmitido a um gerente? Há algo acontecendo na pilha?

questionAnswers(5)

yourAnswerToTheQuestion