Я очень доволен использованием операторов литья в стиле С++ в моем коде, но я не могу сказать, что я действительно понимаю, что происходит за кулисами. Я в основном задаюсь вопросом, что на самом деле происходит с указателем в течение следующего короткого процесса:
class A {};
class B : public A {};
class C : public B {};
A* pC = new C();
B* b = static_cast<B*>(pC); // Is the value of pC changed by the cast?
C* c = static_cast<B*>(pC); // Is the value of pC changed by the cast?
B* b2 = static_cast<B*>(c) // Is the value of c now equal to the value of b2?
Я понимаю, что объект, на который указывает pC
, всегда имеет тип C
, но после того, как сделан первый бросок, я предполагаю, что адрес, хранящийся в b
, больше не равен адресу pC
. Но если литье меняет значение pC
, мое предположение неверно. В двух словах, могут ли операторы литья фактически изменить адрес указателя, который они произвели? Это может показаться довольно легким вопросом, но, на мой взгляд, картина просто не понятна, как объекты с иерархией наследования хранятся в памяти и как манипуляторы манипулируют с помощью трансляций.
В моей голове значение pC
остается неизменным независимо от того, сколько кастингов выполняется на нем, но верно ли это мышление?