代码之家  ›  专栏  ›  技术社区  ›  demoncodemonkey

调用接受基类的函数时是否需要使用动态\强制转换?

  •  1
  • demoncodemonkey  · 技术社区  · 15 年前

    我有这样的课程:

    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)。
    然而,它确实使代码非常难看,所以我想知道它是否真的是必要的。

    你用这种方式使用动态铸造吗?如果是,主要原因是什么?

    3 回复  |  直到 15 年前
        1
  •  1
  •   bdonlan    15 年前

    自从我们知道 bob 属于类型 C^ ,我们知道在编译时它可以被降级为 IA^ 安全等 dynamic_cast 等于 static_cast 在这里。此外,你提议的隐式演员阵容也是安全的。

    动态铸件 仅当从基类型向派生类型上转换时才需要。

        2
  •  2
  •   Bill    15 年前

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

    IA^ temp = /* get a C in some way. */;
    C^ tempC = dynamic_cast<C^>(temp);
    
        3
  •  1
  •   sellibitze    15 年前

    不,我想在C++/CLI中,你也不需要这里的动态转换。派生*隐式转换为基*,除非存在多义w.r.t.多重继承。“gc指针”可能也是如此。在C++中,动态CAST——在上报时需要多态类(至少有一个虚拟函数)。不过,我不知道C++/CLI是如何处理的。我认为每个cli类在默认情况下都是多态的。

    顺便说一下,您可能想删除C++标签。;)