¿Por qué lanzar a las capturas de clase derivadas por base?

Para el siguiente código, el resultado es "EA Exception Finished", lo que significa que aunque lanzamos a la clase derivada, la clase base la capturó. Es siempre? Y si es así, ¿cómo puedo hacer las capturas de clase derivadas para que aparezca "EB Exception Finished"?

Además, no puedo entender exactamente qué significathrow EB() ycatch(EA&). Y lo hacecatch(EA&) significa que el bloque catch obtiene una referencia para EAobjeto?

Perdón por mi ignorancia. Si me recomienda un libro o algo para referirme sobre la estructura de excepciones, sería de gran ayuda.

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;
}

Respuestas a la pregunta(5)

Su respuesta a la pregunta