首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当调用一个接受基类的函数时,我需要使用dynamic_cast吗?

当调用一个接受基类的函数时,我需要使用dynamic_cast吗?
EN

Stack Overflow用户
提问于 2009-10-23 22:07:31
回答 3查看 1.6K关注 0票数 1

我有一些这样的类:

代码语言:javascript
复制
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吗?如果是这样,主要原因是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-23 22:12:33

因为我们知道bob的类型是C^,所以在编译时我们知道它可以安全地被下载到IA^,所以dynamic_cast在这里等价于static_cast。此外,您提出的隐式强制转换也是安全的。

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

票数 1
EN

Stack Overflow用户

发布于 2009-10-23 22:14:20

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

代码语言:javascript
复制
IA^ temp = /* get a C in some way. */;
C^ tempC = dynamic_cast<C^>(temp);
票数 2
EN

Stack Overflow用户

发布于 2009-10-23 22:12:28

不,我认为在C++/CLI中,你在这里也不需要动态类型转换。除非存在歧义w.r.t,否则派生*会隐式转换为Base*。多重继承。"gc-pointers“可能也是如此。在C++中,动态类型转换--向上转换时--需要多态类(至少有一个虚函数)。不过,我不知道C++/CLI如何处理它。我认为每个CLI类默认情况下都是多态的。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1613706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档