Динамические касты и всё такое
От: пффф  
Дата: 28.03.24 19:13
Оценка:
Привет!

Есть интерфейс IInterface.

Есть второй интерфейс: IOther
Он не входит в иерархию наследования IInterface. Микс-ин

Есть InterfaceImplBase : public IInterface
Есть InterfaceImpl1 : public InterfaceImplBase, public IOther
Есть InterfaceImpl2 : public InterfaceImplBase, public IOther

Есть указатель на базу IInterface. Хочу динамик кастом получить указатель на IOther. Пока так думается, что без инфраструктуры типа COM — QueryInterface/AddRef/Release это не получится.

Есть идеи?
Re: Динамические касты и всё такое
От: Stanislav V. Zudin Россия  
Дата: 28.03.24 20:00
Оценка: +2
Здравствуйте, пффф, Вы писали:

П>Есть 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.
_____________________
С уважением,
Stanislav V. Zudin
Отредактировано 28.03.2024 20:05 Stanislav V. Zudin . Предыдущая версия .
Re: Динамические касты и всё такое
От: rg45 СССР  
Дата: 28.03.24 22:56
Оценка:
Здравствуйте, пффф, Вы писали:

П>Есть указатель на базу 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();
}
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 28.03.2024 23:44 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.