2

我正在尝试将接口对象静态转换为继承该接口的派生类的对象。我收到一个错误

“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 作为接口对象。有没有其他方法可以让我表演这个演员?

4

1 回答 1

7

您可以static_cast在您的示例中使用。

但是你必须同时包含它的定义和它才能工作。编译器必须看到,它继承自. 否则,它无法确定确实有效。IInheritcDerivedcDerivedIInheritstatic_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();
}
于 2013-03-14T00:05:14.253 回答