【发布时间】:2011-08-04 07:35:32
【问题描述】:
这是我设置的一些伪代码:
class IMyClass { ... }; // pure virtual class
class CMyBaseClass { .... };
class CMyClass : public CMyBaseClass, public IMyClass { ... }
然后我收集了 CMyBaseClass*。我有自定义的 RTTI,可以让我找出一个类是否实现了给定的接口。所以我可以找到哪些对象具有 IMyClass 实现。我的问题是我无法将其转换为该界面。我不想使用标准 RTTI 和动态转换。
我正在考虑在我的自定义 RTTI 中存储一些指针差异,以便在一对类之间进行转换,但我还没有找到让我满意的实现。
还有其他解决方案吗?
【问题讨论】:
-
不要认为有任何其他解决方案,因为知道如何投射纯粹是 RTTI 的责任,因为你必须先投射到正确的
CMyClass*(或另一个后代)然后“返回" 到实际界面。 -
“自定义 RTTI”是什么意思?为什么不想使用“标准 RTTI”来解决这个问题?执行动态铸造的需要通常意味着设计问题;你确定你想不出更优雅(即多态)的架构吗?
-
您为什么不想使用语言 RTTI?由于您使用的是接口,这意味着您已经拥有虚拟功能,因此您并没有真正避免标准 RTTI...如果您解释您不想要 RTTI 的哪些部分以及为什么,您可能会得到一些解决方案。
-
嗯...我真的需要自定义 RTTI。通过使用我自己的实现,我有自动序列化/反序列化、与脚本语言绑定、一些调试工具等。如果我已经拥有自己的语言,我不应该使用 RTTI 语言,它可以为我提供所有信息除了找出 vtable 之外的层次结构。我也可以添加对这个演员表的支持,但我对我的解决方案并不着迷,所以我想我错过了一些简单的东西。