向下转型接口引用

7

当我尝试将一个对象强制转换为它实现的接口时,出现了运行时异常。

我有以下接口:

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
你能展示一下 getSequence 吗?我尝试重现了你的代码,但没有出现异常。对我来说它是有效的。我改变的只是调用 getSequence 的那一行代码,改成了这样:ISMILTimeContainer^ container = ref new Sequence(); 也许 getSequence 没有返回一个 Sequence - chue x
在WinRT中,不存在继承类的概念。它是通过组合来实现的。我认为在这种情况下,你可以使用safe_cast,它应该可以“跨越”而不仅仅是向上或向下转换。我想你可以把它看作是一种路径查找转换。 - CÅdahl
1个回答

3

你的container是通过隐式转换创建的ISMILTimeContainer。这是向上转型,将派生类对象(getSequence()的返回值,一个Sequence)强制转换为父类或基类对象(ISMILTimeContainer)。

当你尝试在下一条语句中向下转换为ISMILSequence时,由于有继承链,你可以使用static_cast<ISMILSequence^>通过编译器检查。

然而,C++/CX也运行运行时检查[1],在这种情况下,似乎你的变量container,类型为ISMILTimeContainer,没有形成第二个语句所需的所有ISMILSequence信息。虽然ISMILSequenceISMILTimeContainer的子类,但反过来则不一定成立。

有关向上转型和向下转型的信息,请参见[2]或其他谷歌搜索结果。此博客文章的后面几节可能会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接