Я выполнил простой эксперимент:
class BaseA { int a; };
class BaseB { int b; };
class Descendant : public BaseA, BaseB {};
int main() {
Descendant d;
BaseB * b = (BaseB*) &d;
Descendant *d2 = (Descendant *) b;
printf("Descendant: %p, casted BaseB: %p, casted back Descendant: %p\n", &d, b, d2);
}
Вывод:
Descendant: 0xbfc0e3e0, casted BaseB: 0xbfc0e3e4, casted back Descendant: 0xbfc0e3e0
Хорошо понимать, что статическое приведение не всегда означает «изменить тип, не касаясь содержимого». (Хорошо, когда типы данных не соответствуют друг другу, тогда будет также вмешательство в контент, но это другая ситуация IMO.)