这是我的设置的一些伪代码:
class IMyClass { ... }; // pure virtual class
class CMyBaseClass { .... };
class CMyClass : public CMyBaseClass, public IMyClass { ... }
Run Code Online (Sandbox Code Playgroud)
然后我收集了CMyBaseClass*.我有自定义RTTI,它允许我找出一个类是否实现给定的接口.所以我可以找到哪些对象有IMyClass实现.我的问题是我无法将其强制转换为该界面.我不想使用标准RTTI和动态强制转换.
我正在考虑在我的自定义RTTI中存储一些指针差异,以便在一对类之间进行转换,但我还没有弄清楚让我开心的实现.
还有其他方法吗?
好吧,如果你坚持不使用语言RTTI,你可以像旧的COM一样使用:使你的所有类或接口派生自以下接口:
class IMyCast // similar to IUnknown
{
public:
virtual void *CastTo(interfaceId_t id) = 0; //Similar to IUnknown::QueryInterface
};
Run Code Online (Sandbox Code Playgroud)
现在在你的CMyClass中:
class CMyClass : public CMyBaseClass, public IMyClass
{
//...
void *CastTo(interfaceId_t id)
{
switch (id)
{
case IMyClass_id: //or whatever
return static_cast<IMyClass*>(this);
//...other cases
default:
throw std::bad_cast(); //or return NULL
}
}
};
Run Code Online (Sandbox Code Playgroud)
然后在用户代码中:
CMyBaseClass *obj;
IMyClass *my = static_cast<IMyClass*>(obj->CastTo(IMyClass_id));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2900 次 |
| 最近记录: |