Я пытаюсь 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 в качестве объекта интерфейса. Есть ли другой способ, которым я мог бы выполнить этот актерский состав?
Ты можешь использовать 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();
}
Других решений пока нет …