Подтвердить что ты не робот

Вызывает ли оператор слияния в стиле С++ указатель, который он выполняет?

Я очень доволен использованием операторов литья в стиле С++ в моем коде, но я не могу сказать, что я действительно понимаю, что происходит за кулисами. Я в основном задаюсь вопросом, что на самом деле происходит с указателем в течение следующего короткого процесса:

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 остается неизменным независимо от того, сколько кастингов выполняется на нем, но верно ли это мышление?

4b9b3361

Ответ 1

Выбранный указатель может указывать на другое место. В случае множественного наследования, например. Хорошо читать

Исходный указатель будет сохранен

Ответ 2

Ни в коем случае литье не меняет свой операнд. Все, что он делает, это изменить способ, которым компилятор видит операнд.

Значение pC не будет изменено; результат приведения может быть идентичным значением, но другим типом (например, в случае const_cast или reinterpret_cast), или он может быть и другим типом и другим значением (например, в случае static_cast в случае множественного наследования см. ответ Andrew).

Чтобы понять, в каких случаях будет происходить другое значение результата, вам нужно будет прочитать на С++ ABI, т.е. как объекты хранятся в памяти точно.

Ответ 3

В вашем случае он не меняет указатель.

Но для множественного наследования ему придется изменить указатель.

Вы можете написать пример программы, чтобы подтвердить это.

Ответ 4

Короткий ответ:

С помощью бросков вы просто рассказываете компилятору, как интерпретировать объект, т.е. какого типа я должен думать, что объект есть.

Приведение не меняет значения объекта.