Скажем, у меня есть два интерфейса IFoo
и IBar
; плюс конкретный тип FooBar
, реализующий эти интерфейсы:
class FooBar : public IFoo, public IBar
{
//FooBar stuff
};
Где-то я получаю указатель void*
, указывающий на экземпляр FooBar
.
void* fooBar = getOrCreateStuff();
Теперь я хочу получить указатель на IBar
из моего fooBar
экземпляра.
IBar* iBar = static_cast< IBar* >(fooBar);
К сожалению, iBar
не указывает на правильный адрес памяти. Пример глупый нарочно - в реальной жизни я не знаю конкретный тип, на который я указываю.
РЕДАКТИРОВАТЬ : Я пишу API, в котором я раскрываю метод template <class StuffT> StuffT getOrCreateStuff()
. На данный момент нет абсолютно никакого способа узнать, какие типы разработчиков используют. Приведенный выше пример показывает вам, как этот метод должен использоваться. Мы регистрируем конкретный тип в API и возвращаем его как интерфейс. При работе с одиночным наследованием он работает как обаяние, но множественное наследование является более сложным.
Есть идеи, чтобы мой iBar указывал на смещение рабочего адреса?