static_cast 派生类的接口

Posted

技术标签:

【中文标题】static_cast 派生类的接口【英文标题】:static_cast an interface to derived class 【发布时间】:2013-03-13 23:53:38 【问题描述】:

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

'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 作为接口对象。还有其他方法可以让我执行此演员吗?

【问题讨论】:

你用的是什么编译器?这个works for me. 你能提供一个完整的例子来显示错误和完整的错误信息吗? IInheritcDerived定义在错误发生的地方是否都可见? 碰巧,真正的问题是因为您在声明 cDerived 之后在头文件中声明了 IInherit,就像上面所做的那样?或者这就是您在上面的代码中剪切和粘贴的方式。 cDerived 声明后缺少分号。我只是想知道在显示此错误之前编译器是否会出现其他错误。 不,我已经提前声明了派生类,可见性没有问题 【参考方案1】:

您可以在示例中使用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();

【讨论】:

这就是答案。 static_cast 需要的不仅仅是一个前向声明,以确保至少可以进行强制转换(尽管您仍然可能对编译器撒谎)。 @vaibhavkumar 仅可见性不是问题,编译器必须看到定义,即继承。我更新了我的答案。

以上是关于static_cast 派生类的接口的主要内容,如果未能解决你的问题,请参考以下文章

通过指向base,static_cast,crtp,删除模板的指针派生的成员

static_cast显示完成隐式转换

static_cast和dynamic_cast详解

error C2440: “static_cast”: 无法从“void (__thiscall CMainFrame::* )

static_cast 剖析

[C/C++]_[中级]_[static_cast的详细解析]