Downcast en una jerarquía de diamantes

Por quéstatic_cast ¿no se puede bajar desde una base virtual?

struct A {};
struct B : public virtual A {};
struct C : public virtual A {};
struct D : public B, public C {};

int main()
{
  D d;
  A& a = d;
  D* p = static_cast<D*>(&a); //error
}  

g ++ 4.5 dice:

 error: cannot convert from base ‘A’ to derived type ‘D’ via virtual base ‘A’

La solución es usardynamic_cast? pero por qué. ¿Qué es lo racional?

- editar -
Muy buenas respuestas a continuación. Sin embargo, las respuestas no detallan exactamente cómo los subobjetos y las vtables terminan siendo ordenados. El siguiente artículo da algunos buenos ejemplos para gcc:
http: //www.phpcompiler.org/articles/virtualinheritance.html#Downcastin

Respuestas a la pregunta(2)

Su respuesta a la pregunta