Tu as plus de détails là:
http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.8 (et successives) et dans cet article:
http://www.drdobbs.com/184402074.
Pour l'histoire des
dynamic_cast, si tu as un diamant de la sorte:
class A : public B, public C { … };
class B : virtual public D { … };
class C : virtual public D { … };
class D { … };
alors tu vas avoir 2 problèmes avec
static_cast:
1. Un
static_cast de D* en B* ou C* est autorisé,
mais si tu as un D* qui est en réalité un A* et si tu fais un
static_cast vers B* ou C*, ça va foirer!
2. Un
static_cast de D* en A* n'est carrément pas autorisé!
Tout ceci parce qu'il y a un offset à respecter lors de la conversion contrairement à l'héritage simple et parce que cet offset est de plus
variable contrairement à l'héritage multiple non-virtuel. Seule la machinerie RTTI permet de calculer le bon offset en fonction du type réel de l'objet.
(Et évidemment,
reinterpret_cast est carrément inutilisable pour ces cas, il foire même pour l'héritage multiple non-virtuel parce qu'il ne gère pas les offsets.)