我有一些这样的类:
interface class IA
{
};
interface class IB
{
};
public ref class C : public IA, public IB
{
};
public ref class D
{
void DoSomething(IA^ aaa)
{
}
void Run()
{
C^ bob = gcnew C();
DoSomething(dynamic_cast<IA^>(bob)); // #1
DoSomething(bob); // #2
}
};目前,在调用这样的函数时,我总是尝试使用动态类型转换(上面的#1 )。
然而,它确实让代码变得相当丑陋,所以我想知道它是否真的有必要。
你以这种方式使用dynamic_cast吗?如果是这样,主要原因是什么?
发布于 2009-10-23 22:12:33
因为我们知道bob的类型是C^,所以在编译时我们知道它可以安全地被下载到IA^,所以dynamic_cast在这里等价于static_cast。此外,您提出的隐式强制转换也是安全的。
仅当从基类型向上转换为派生类型时才需要dynamic_cast。
发布于 2009-10-23 22:14:20
在标准C++中,您使用dynamic_cast向下遍历层次结构,而不是向上遍历。在本例中,您将使用它尝试将IA或IB转换为C:
IA^ temp = /* get a C in some way. */;
C^ tempC = dynamic_cast<C^>(temp);发布于 2009-10-23 22:12:28
不,我认为在C++/CLI中,你在这里也不需要动态类型转换。除非存在歧义w.r.t,否则派生*会隐式转换为Base*。多重继承。"gc-pointers“可能也是如此。在C++中,动态类型转换--向上转换时--需要多态类(至少有一个虚函数)。不过,我不知道C++/CLI如何处理它。我认为每个CLI类默认情况下都是多态的。
顺便说一句,您可能想要删除C++标记。;)
https://stackoverflow.com/questions/1613706
复制相似问题