Здравствуйте, пффф, Вы писали:
П>Есть InterfaceImplBase : public IInterface
П>Есть InterfaceImpl1 : public InterfaceImplBase, public IOther
П>Есть InterfaceImpl2 : public InterfaceImplBase, public IOther
П>Есть указатель на базу IInterface. Хочу динамик кастом получить указатель на IOther. Пока так думается, что без инфраструктуры типа COM — QueryInterface/AddRef/Release это не получится.
По идее dynamic_cast такое должен прожевать.
https://en.cppreference.com/w/cpp/language/dynamic_cast
Твой случай: sidecast.
Здравствуйте, пффф, Вы писали:
П>Есть указатель на базу IInterface. Хочу динамик кастом получить указатель на IOther. Пока так думается, что без инфраструктуры типа COM — QueryInterface/AddRef/Release это не получится.
Все получится. dynamic_cast умеет делать такие преобразования.
http://coliru.stacked-crooked.com/a/ba3eb2b8731c8474
#include <iostream>
class IInterface
{
public:
virtual void Foo() = 0;
virtual ~IInterface(){}
};
class IOther
{
public:
virtual void Bar() = 0;
virtual ~IOther(){}
};
class InterfaceImplBase : public IInterface
{
public:
virtual ~InterfaceImplBase(){}
};
class InterfaceImpl1 : public InterfaceImplBase, public IOther
{
public:
void Foo() override { std::cout << "InterfaceImpl1::Foo()" << std::endl; }
void Bar() override { std::cout << "InterfaceImpl1::Bar()" << std::endl; }
virtual ~InterfaceImpl1(){}
};
int main()
{
InterfaceImpl1 impl;
IInterface* iFace = &impl;
IOther* iOther = dynamic_cast<IOther*>(iFace);
iFace->Foo();
iOther->Bar();
}