当我尝试将对象转换为我非常确定它实现的接口时,我遇到了运行时异常。
我有以下界面:
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不支持此类接口
据我所知,这应该有效。我正在尝试做什么有问题,或症状是否表明实施问题(某些事情与上述要求不同)?
答案 0 :(得分:3)
您的container
是由隐式演员创建的ISMILTimeContainer
。这是向上转换,将派生类对象(getSequence()
的返回值,Sequence
)转换为父类或基类对象(ISMILTimeContainer
)。
当您尝试在下一个语句中向下转换为ISMILSequence
时,因为您有一个继承链,所以使用static_cast<ISMILSequence^>
传递编译器检查。
但是,C ++ / CX还运行运行时检查[1],在这种情况下,container
类型ISMILTimeContainer
变量似乎没有所需的全部信息。在第二个陈述中形成ISMILSequence
。虽然ISMILSequence
IS-A ISMILTimeContainer
,但情况恰恰相反。
有关向上投射和向下投射的信息,请参阅[2]或其他Google搜索结果。本博客文章的后面部分可能会有所帮助。