2013-03-13 68 views
1

我想將一個接口對象static_cast轉換爲繼承該接口的派生類的對象。我得到一個錯誤static_cast派生類的接口

'的static_cast:不能從轉換「IInherit *」到「反應而得*」

派生類和接口有以下幾種格式。

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; 
}; 

我有通過getInherit()方法中的代碼訪問的vector<IInherit*>對象使得getInherit()的類型[0]反應而得* 我使用的表達進行靜態澆鑄:

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

我不確定是否有可能將static_cast作爲接口對象。有沒有其他的方法可以演出這個角色?

+0

你使用什麼編譯器?這[適用於我](http://ideone.com/ESohQ3)。 – 2013-03-14 00:00:47

+2

你能提供一個完整的例子來顯示錯誤和完整的錯誤信息嗎? – JoergB 2013-03-14 00:01:17

+1

「IInherit」和「cDerived」的**定義**在發生錯誤的地方都可見? – 2013-03-14 00:02:40

回答

5

你可以在你的例子中使用static_cast

但是,您必須包含這兩個定義IInheritcDerived才能正常工作。編譯器必須看到,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(); 
} 
+1

這是答案。 static_cast不僅需要前向聲明來確保轉換至少可能(儘管您仍然可以對編譯器說謊)。 – 2013-03-14 00:14:43

+1

@vaibhavkumar只有可視性不是問題,編譯器必須看到定義,即繼承。我更新了我的答案。 – 2013-03-14 00:16:27

+0

雅這工作。非常感謝您的回覆。 – 2013-03-14 00:18:49