2

インターフェイスオブジェクトを、そのインターフェイスを継承する派生クラスのオブジェクトに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()[0]のタイプがcDerived *になるように、getInherit()メソッドを介してコードでアクセスできるオブジェクトがあります。次の式を使用して静的キャストを実行しています。

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 に答える