Вот глупая идея, для случая, когда вы застряли с одним из базовых указателей, но можете свободно изменять классы. Предположим, у нас есть:
struct InBetween : Rock, HardPlace { /* ... */ }
и предположим, что у вас есть только Rock
-показатели. Изменить Rock
следующим образом:
struct Rock
{
virtual HardPlace * get_other() const = 0;
// ...
};
Теперь добавьте к каждому производному классу следующее:
struct InBetween : Rock, HardPlace
{
virtual HardPlace * get_other() const { return this; }
// ...
};
Теперь, учитывая Rock * r
, вы можете сказать HardPlace * h = r->get_other()
.
Я бы не стал называть это хорошим дизайном или даже рекомендовать его, но я думаю, что это буквальный ответ на ваш вопрос.