1

我有一些这样的课程:

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?如果有,主要原因是什么?

4

3 回答 3

2

在标准 C++ 中,您使用 dynamic_cast 沿着层次结构向下走,而不是向上走。在这种情况下,您将使用它来尝试将 IA 或 IB 转换为 C:

IA^ temp = /* get a C in some way. */;
C^ tempC = dynamic_cast<C^>(temp);
于 2009-10-23T14:14:19.570 回答
1

不,我认为在 C++/CLI 中你也不需要动态转换。Derived* 隐式转换为 Base* ,除非多重继承存在歧义。“gc-pointers”可能也是如此。在 C++ 中,动态转换(向上转换时)需要多态类(至少具有一个虚函数)。不过,我不知道 C++/CLI 是如何处理它的。我认为每个 CLI 类默认都是多态的。

顺便说一句,您可能想要删除 C++ 标记。;)

于 2009-10-23T14:12:28.370 回答
1

由于我们知道bob是 type C^,我们知道在编译时它可以IA^安全地向下转换,因此dynamic_cast等价于static_cast这里。此外,您建议的隐式转换也是安全的。

dynamic_cast仅在从基本类型向上转换为派生类型时才需要。

于 2009-10-23T14:12:32.803 回答