转发界面参考

时间:2014-11-04 18:25:09

标签: casting c++-cx

当我尝试将对象转换为我非常确定它实现的接口时,我遇到了运行时异常。

我有以下界面:

public interface class ISMILTimeContainer;
public interface class ISMILSequence : ISMILTimeContainer;
public interface class ISMILParallel : ISMILTimeContainer;

我有以下课程:

ref class TimeContainer : public ISMILTimeContainer;
ref class Sequence : public TimeContainer, ISMILSequence;
ref class Parallel : public TimeContainer, ISMILParallel;

然后,我尝试以下方法:

ISMILTimeContainer^ container = getSequence(); // returns a Sequence^
ISMILSequence^ sequence = static_cast<ISMILSequence^>(container);

这会在运行时抛出异常:

  

Platform :: InvalidCastException ^在内存位置0x04AFD83C。   HRESULT:0x80004002不支持此类接口

据我所知,这应该有效。我正在尝试做什么有问题,或症状是否表明实施问题(某些事情与上述要求不同)?

1 个答案:

答案 0 :(得分:3)

您的container是由隐式演员创建的ISMILTimeContainer。这是向上转换,将派生类对象(getSequence()的返回值,Sequence)转换为父类或基类对象(ISMILTimeContainer)。

当您尝试在下一个语句中向下转换为ISMILSequence时,因为您有一个继承链,所以使用static_cast<ISMILSequence^>传递编译器检查。

但是,C ++ / CX还运行运行时检查[1],在这种情况下,container类型ISMILTimeContainer变量似乎没有所需的全部信息。在第二个陈述中形成ISMILSequence。虽然ISMILSequence IS-A ISMILTimeContainer,但情况恰恰相反。

有关向上投射和向下投射的信息,请参阅[2]或其他Google搜索结果。本博客文章的后面部分可能会有所帮助。