Как работает reinterpret_cast?

Рейтинг: 0Ответов: 1Опубликовано: 19.06.2023
struct foo {
    int a = 1;
};

struct bar {
    int b = 2;
};

struct baz : foo, bar {
    int c = 3;
};


int main() {
    baz oBaz;
    auto s_cast = static_cast<foo*>(&oBaz);
    auto r_cast = reinterpret_cast<bar*>(&oBaz);
    std::cout << s_cast->a << std::endl;
    std::cout << r_cast->b << std::endl;
}

Как в данном случае работает reinterpret_cast? Почему на консоли я вижу 1, 1?

Ответы

▲ 2Принят

Потому что при этом приведении никакое наследование никак не используется. Просто кусок памяти объявляется содержащим то baz, то bar — один и тот же кусок, заметим.

Из-за конкретного размещения baz в памяти (начиная с foo) и поскольку вся структура bar из одного числа, это число в памяти от foo и выступает то в роли baz.a, то bar.b.

Никакой гарантии именно такого размещения нет, как сказал user7860670, это неопределенное поведение.