Как восстановить указатель на не первый базовый класс из неизвестного производного класса? Имеется некоторые классы A, B, C, D, E.
A, B, C из них интерфейсы.
Иерархия наследования такова:
У классов D и E по два родителя
{A, C} -> D, {B, C} -> E.
Так вот. У меня есть функция, в которую передаётся указатель типа void*, но подразумевается что он указывает на объект одного из этих классов. Мне нужно корректно привести этот указатель void* к указателю на класс C. Обычный reinterpret_cast приводит к вылетам программы, когда вызываются методы не первого базового класса, т.е. Если я привёл void* который указывал на класс D, к указателю на C и вызвал один из методов C, то это приводило к вылету, но если приводить к указателю на класс A и вызывать его методы, то всё работает хорошо.

21 Авг 2019 в 06:59
191 +1
1
Ответы
1

В данном случае вам нужно использовать static_cast для приведения указателя на производный класс к указателю на базовый класс. Например, если у вас есть указатель void* ptr на объект класса D или E, и вам нужно привести его к указателю на класс C, можно сделать следующим образом:

void* ptr = // указатель на объект класса D или E
C* c_ptr = static_cast<C*>(static_cast<D*>(ptr)); // или static_cast<C*>(static_cast<E*>(ptr));

Таким образом, вы сначала приводите указатель void* к указателю на класс D или E, а затем уже к указателю на класс C. После этого вы сможете вызывать методы класса C без проблем.

Приведение указателя с помощью static_cast является более безопасным и предпочтительным способом, чем reinterpret_cast, особенно при работе с иерархиями наследования.

20 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир