static_cast is performing look up in the class hierarchy in order to cast to the correct class, it doesn't reinterpret the bits (that is reinterpret_cast).
The same thing happens with dynamic_cast, the difference being that static_cast is done at compile time while dynamic_cast is done at runtime.
Take the following example :
A : B , A : C , D : B,C
The following code will print that the pointers point to a different memory block
{
D *ptrToD = new D();
C *ptr1 = static_cast<C>(ptrToD);
C *ptr2 = reinterpret_cast<C>(ptrToD);
if (ptr1==ptr2)
{
printf("Pointers point to the same memory block");
} else
{
printf("Pointers point to different memory blocks");
}
}
If you look at the memory , it will look something like
ABACD
If you want to cast it to C , C starts from where D starts +sizeof(B) (AC) ,whereas A and B starts from the same memory block as D.