Понижение в алмазной иерархии

Почему static_cast не может быть понижен с виртуальной базы?

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(&a); //error
}  

g ++ 4.5 говорит:

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

Решение - использовать dynamic_cast ? но почему. Что такое рациональное?

- править -
Очень хорошие ответы ниже. Однако нет ответов, которые подробно описывают, как именно упорядочиваются подобъекты и таблицы vtables. В следующей статье приведены несколько хороших примеров для gcc:
http://www.phpcompiler.org/articles/virtualinheritance.html#Downcasting

23
задан log0 21 May 2014 в 10:16
поделиться