Por que jogar em capturas de classe derivada por base?

Para o código abaixo, o resultado é "Exceção EA concluída", o que significa que, embora tenhamos jogado na classe derivada, ela foi capturada pela classe base. Sempre? E se sim, como posso fazer a captura da classe derivada, assim "Exceção EB concluída" aparece?

Também não consigo entender exatamente o que significathrow EB() ecatch(EA&). E fazcatch(EA&) significa que o bloco catch recebe uma referência para o EAobjeto?

Desculpe pela minha ignorância. Se você me recomendar um livro ou algo sobre a estrutura de exceções, seria uma grande ajuda.

class EA {};
class EB: public EA {};

void F()
{
  throw EB();  // throw at EB().
}

int main()
{
  try
  {
    F();
  }
  catch(EA&) // caught here??
  {
    std::cout<<"EA Exception";
  }
  catch(EB&) // why not me? every time?
  {
    std::cout<<"EB Exception";
  }

  std::cout<<" Finished"<<std::endl;

  return 0;
}