A cross cast converts a multiply-inherited object to one of its secondary base classes. To demonstrate what a cross cast does, consider this class hierarchy:
struct A{ int i; virtual ~A () {} };struct B{ bool b;};struct D: public A, public B{ int k; D() { b = true; i = k = 0; } };A *pa = new D;B *pb = dynamic_cast pa; //cross cast; convert to the second base class
The static type of pa is “pointer to A”, whereas its dynamic type is “pointer to D”. A simple static_cast cannot convert a “pointer to A” into a “pointer to B” because A and B are unrelated (your compiler issues an error message in this case). To perform the cross cast properly, the value of pb has to be calculated at run time. After all, the cross cast can appear in a source file that doesn’t even know that class D exists. To get the cross cast done properly, a dynamic cast is required, as shown in the example.