我有一些这样的课程:

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 ++标记。 ;)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top