gcc thunk hack для множественного наследования - PullRequest
3 голосов
/ 15 декабря 2011

У меня есть класс X, полученный из Y и Z (интерфейс). Объект этого класса передается в библиотеку как void *, которая имеет доступ только к интерфейсу Z. [Причина, по которой он не передается как Z *, заключается в том, что существует промежуточный компонент, который принимает только void *]

Расположение виртуальной таблицы с gcc thunks будет X, Y указывает на тот же адрес, однако Z указывает на X + 8

Итак, мне нужно типизировать объект как (Z *) (obj + 8), чтобы добраться до Z. Это безопасно, есть ли альтернативы? Я не могу использовать RTTI.

Ответы [ 2 ]

3 голосов
/ 15 декабря 2011

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

То есть:

X *theX = ...;
void *ptr = static_cast<Z*>(theX)

Затем в коде получения:

void *ptr = ...;
Z *theZ = static_cast<Z*>(ptr);

И если вы знаете , что это на самом деле X:

X *theX = static_cast<X*>(theZ);

Нижняя строка: всякий раз, когда вы приводите указатель на void* иназад, он должен быть преобразован в тот же тип, что и раньше.

Таким образом, это не определено:

X *theX = ...;
void *ptr = static_cast<void*>(theX);
Z *theZ = static_cast<Z*>(ptr); //Undefined behavior!!!

Событие, хотя Z является подклассом X, ипрямое static_cast между ними сработало бы.

2 голосов
/ 15 декабря 2011

Нет, литье (Z*)(obj + 8) не безопасно.

Приведите объект к Z* перед приведением к void*, затем приведите void* обратно к Z*. Это будет безопасно.

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