O conceito que permite referenciar objetos de subclasses como se fossem objetos de sua superclasse, possibilitando que o programa determine em tempo de execução qual método chamar com base no tipo do objeto, é denominado