static_cast интерфейс к производному классу

Я пытаюсь static_cast интерфейсный объект в объект производного класса, который наследует этот интерфейс. Я получаю ошибку

«static_cast»: невозможно преобразовать из «IInherit *» в «cDerived *»

Производный класс и интерфейс имеют следующий формат.

class cDerived: public IInherit
{
Repo* p_Repos;
public:
cDerived(Repo* pRepos)
{
p_Repos = pRepos;
}
Repo* GetRepo()
{
return p_Repos;
}
void doAction(ITok*& pTc)
{
///some logic
}

}

class IInherit
{
public:
virtual ~IInherit() {}
virtual void doAction(ITok*& pTc)=0;
};

у меня есть vector<IInherit*> объект, доступный в коде через метод getInherit (), так что тип getInherit () [0] — cDerived *
Я выполняю статическое приведение, используя выражение:

Repo* pRep= static_cast<cDerived*>(getInherit()[0])->GetRepo();

Я не уверен, возможно ли использовать static_cast в качестве объекта интерфейса. Есть ли другой способ, которым я мог бы выполнить этот актерский состав?

1

Решение

Ты можешь использовать static_cast в вашем примере.

Но вы должны включить оба определения из IInherit а также cDerived чтобы это работало. Компилятор должен видеть, что cDerived наследуется от IInherit, В противном случае он не может решить, что static_cast действительно действительно.

#include <vector>

struct R {};
struct B {};
struct D : public B {
R *getR() { return new R(); }
};

void f()
{
std::vector<B*> v;
v.push_back(new D());
D *d = static_cast<D*>(v[0]);
R *r = d->getR();
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]