Смещение для завершения объекта из подобъекта - PullRequest
2 голосов
/ 27 декабря 2011

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

Текущая версия моего экспериментального интеллектуального указателя может сравнивать только местоположение полного объекта и одного из его подобъектов. Просто храните их адреса и размеры в байтах и ​​смотрите, не перекрываются ли они. Проблема заключается в сравнении двух подобъектов полного объекта в случае множественного наследования. Поскольку эти подобъекты не будут перекрывать друг друга, они не будут распознаваться как принадлежащие одному и тому же объекту. Это потребовало бы смещения «головы» всего объекта от подобъекта, чтобы получить адрес полного объекта для сравнения.

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

Можно ли перехватить виртуальную таблицу, чтобы получить смещение для всего объекта? Мне не удалось найти стандартную функцию, которая позволяет вам сделать это. Мое предположение состоит в том, что злоупотребление vtable сильно зависит от реализации и, скорее всего, не будет повторно использоваться на другом компиляторе. Использование typeid на объекте позволяет определить, какой объект передается подобъекту, поэтому я считаю, что этого можно достичь. Жаль, что этот адрес не вернется ...

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

1 Ответ

2 голосов
/ 27 декабря 2011
dynamic_cast<void*>(myBaseObject);

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

...