Почему типирование объекта не меняет его адрес? Где хранится информация о типе объекта? - PullRequest
1 голос
/ 12 июня 2019

Я только что проверил это с помощью qobject_cast (но я думаю, что это будет то же самое для любого другого типа приведения типов), и, очевидно, приведение объекта к другому типу не меняет его адрес.Это заставляет меня думать, что информация о типе объекта хранится в другом месте ... это правильно?

Я все еще новичок в C ++, так что, если в этом нет никакого смысла, не стесняйтесь и мне это сказать.Любая помощь приветствуется.

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

Почему типизация объекта не меняет его адрес?

Поскольку типизация абсолютно не влияет на исходный объект 1 .Приведение типов всегда создает новый объект (возможно другого типа) или ссылку.Кроме того, нет операции, которая могла бы изменить адрес любого объекта.Объект хранится в одном адресе в течение всего времени его жизни.

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

1 Технически, конструктор преобразования или оператор преобразования может изменить исходный объект, но это будет ужасно необычно.

Где хранится информация о типе объекта?

Информация о типе «сохраняется» компилятором во время компиляции программы.В general информация не должна храниться самой программой.

В конкретном случае полиморфных типов некоторая информация о типе объектахранится в памяти программы для поддержки dynamic_cast и динамического typeid.Он хранится в любом месте, выбранном реализацией языка.

Я только что проверил это, используя qobject_cast

В C ++ нет такой вещи, как qobject_cast.Возможно, вы используете какую-то библиотеку.

1 голос
/ 12 июня 2019

В некоторых случаях приведение типов действительно изменяет видимый адрес исходного объекта.Адрес исходного исходного объекта не изменяется, но адрес «того же самого объекта» (не недавно созданного преобразованного объекта) может отличаться, если объект, ссылка или указатель на производный класс приведен с помощью static_cast илиdynamic_cast на ссылку или указатель на базовый класс, когда производный класс наследует базовый класс в иерархии множественного наследования, а базовые классы либо содержат данные, либо являются полиморфными (или оба).«Другой адрес» фактически является адресом в исходном объекте, где находится часть базового класса общего производного класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...