Olá, Leonardo, tudo bem?
O que tá acontecendo é que RequisicaoIncorreta é uma subclasse de ErroBase. Isso significa que RequisicaoIncorreta é um tipo específico de ErroBase. Então, quando você tem uma instância de RequisicaoIncorreta, ela também é uma instância de ErroBase.
No código, quando ocorre um erro, é criada uma nova instância de RequisicaoIncorreta e passada para a função next(), isso faz com que o erro seja capturado pelo manipulador de erros.
Já nomanipulador de erros, ele verifica se o erro é uma instância de ErroBase (e lembre-se, RequisicaoIncorreta é um tipo de ErroBase), então ele chama o método enviarResposta(res) no erro. Como RequisicaoIncorreta é uma subclasse de ErroBase, ela herda todos os métodos de ErroBase, mas também pode ter seus próprios métodos. Nesse caso, RequisicaoIncorreta não tem seu próprio método enviarResposta(res), então ele usa o método da classe mãe, ErroBase.
O que significa que, mesmo que estejamos capturando um ErroBase, a mensagem do RequisicaoIncorreta é enviada porque é uma instância de RequisicaoIncorreta que está sendo passada para o manipulador de erros.
Espero que isso esclareça sua dúvida!
Um abraço e bons estudos.