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. 你能提供一个完整的例子来显示错误和完整的错误信息吗?IInherit
和cDerived
的定义在错误发生的地方是否都可见?
碰巧,真正的问题是因为您在声明 cDerived 之后在头文件中声明了 IInherit,就像上面所做的那样?或者这就是您在上面的代码中剪切和粘贴的方式。 cDerived 声明后缺少分号。我只是想知道在显示此错误之前编译器是否会出现其他错误。
不,我已经提前声明了派生类,可见性没有问题
【参考方案1】:
您可以在示例中使用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();
【讨论】:
这就是答案。 static_cast 需要的不仅仅是一个前向声明,以确保至少可以进行强制转换(尽管您仍然可能对编译器撒谎)。 @vaibhavkumar 仅可见性不是问题,编译器必须看到定义,即继承。我更新了我的答案。以上是关于static_cast 派生类的接口的主要内容,如果未能解决你的问题,请参考以下文章
通过指向base,static_cast,crtp,删除模板的指针派生的成员
error C2440: “static_cast”: 无法从“void (__thiscall CMainFrame::* )