在调用接受基类的函数时,是否需要使用dynamic_cast?
-
06-07-2019 - |
题
我有一些这样的课程:
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?如果是这样,主要原因是什么?
解决方案
因为我们知道 bob
的类型是 C ^
,所以我们知道在编译时它可以安全地下载到 IA ^
,所以 dynamic_cast
在这里等同于 static_cast
。而且,你提出的隐含演员也是安全的。
dynamic_cast
仅在从基类型向上传播时需要。
其他提示
在标准C ++中,您使用dynamic_cast来向下遍历层次结构,而不是向上。在这种情况下,您可以使用它来尝试将IA或IB转换为C:
IA^ temp = /* get a C in some way. */;
C^ tempC = dynamic_cast<C^>(temp);
不,我认为在C ++ / CLI中你也不需要动态转换。 Derived *隐式转换为Base *,除非存在歧义w.r.t.多重继承。 “gc-pointers”可能也是如此。在C ++中,动态转换 - 在向上转换时 - 需要多态类(至少有一个虚函数)。不过,我不知道C ++ / CLI如何处理它。我认为每个CLI类默认都是多态的。
顺便说一下,您可能想要删除C ++标记。 ;)
不隶属于 StackOverflow