【C++】dynamic_cast基本用法(详细讲解)

这篇具有很好参考价值的文章主要介绍了【C++】dynamic_cast基本用法(详细讲解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

c++ dynamic_cast,C/C++,c++,java,开发语言


👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉公众号👈:测试开发自动化【获取源码+商业合作】
👉荣__誉👈:阿里云博客专家博主、51CTO技术博主
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。


C++中dynamic_cast基本用法(详细讲解)



dynamic_cast 是 C++ 中的一个类型转换操作符,它主要用于多态类型之间的转换。其特点是在运行时进行类型检查,确保所执行的转换是安全的。因此,它主要用于指向类的指针或引用之间的转换,尤其是在类的继承体系中。

1. 使用场景

1.1向下转型

将基类指针或引用转换为派生类指针或引用。这是 dynamic_cast 最常见的用途。

    class Base {};
    class Derived : public Base {};

    Base* basePtr = new Derived;
    Derived* derivedPtr = dynamic_cast<Derived*>(basePtr); 

如果转换成功,derivedPtr 将是一个有效的指针;如果转换失败(例如,如果 basePtr 实际上不指向 Derived 类的对象),derivedPtr 将是 nullptr

1.2横向转型

在同一继承层级的不同派生类之间进行转换。

    class Base {};
    class Derived1 : public Base {};
    class Derived2 : public Base {};

    Base* basePtr = new Derived1;
    Derived2* derived2Ptr = dynamic_cast<Derived2*>(basePtr); 

在这种情况下,derived2Ptr 会是 nullptr,因为 basePtr 实际上指向的是 Derived1 类的对象。


2. 前提条件

为了使 dynamic_cast 能够进行运行时类型检查,以下条件必须满足:

  • 转换涉及的类型至少有一个虚函数。换句话说,基类必须有虚函数,以支持运行时类型信息 (RTTI)。

    class Base {
    public:
        virtual void foo() {}
    };
    
  • 编译器需要启用 RTTI。大多数现代 C++ 编译器默认启用 RTTI,但有些情况下可能需要显式地开启它。


3. 优点

  • 安全性dynamic_cast 提供运行时的类型检查,这使得转换更加安全。如果转换无法进行,对于指针转换,它返回 nullptr;对于引用转换,它抛出一个 std::bad_cast 异常。

4. 缺点

  • 性能开销:由于 dynamic_cast 需要在运行时进行类型检查,所以它相对于其他转换(如 static_cast)来说,有一定的性能开销。

总之,dynamic_cast 在处理与多态相关的类型转换时是非常有用的,尤其是当你不确定实际类型时。但由于其性能开销,你应该在必要时才使用它,并确保 RTTI 在你的编译器中是启用的。文章来源地址https://www.toymoban.com/news/detail-721865.html

到了这里,关于【C++】dynamic_cast基本用法(详细讲解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【036】读懂C++的强制类型转换static_cast、const_cast、dynamic_cast以及reinterpret_cast

    💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。 👉 🎖️ CSDN实力新星,社区专家博主 👉 🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、

    2024年02月12日
    浏览(36)
  • static_cast与dynamic_cast到底是什么?

    写这个随笔说一下C++的static_cast和dynamic_cast用在子类与父类的指针转换时的一些事宜。首先,【static_cast,dynamic_cast】【父类指针,子类指针】,两两一组,共有4种组合:用 static_cast 父类转子类、用 static_cast 子类转父类、使用 dynamic_cast 父类转子类、用 dynamic_cast 子类转父类

    2024年04月24日
    浏览(30)
  • c++ 之 dynamic_pointer_cast

    /*  * dynamic_pointer_cast  */     描述 (Description)         它返回一个正确类型的sp副本,其存储的指针从U *动态地转换为T *。     声明 (Declaration)         以下是std :: dynamic_pointer_cast的声明。         template class T, class U           shared_ptrT dynamic_pointer_cast (const shared_

    2024年02月15日
    浏览(36)
  • 【UE C++】FString的基本用法

    字符串的增删查改 构造和赋值操作 追加,append和AppendChars ,字符串末尾增加另一个字符串 插入操作void InsertAt(int32 Index, const FString Characters),在指定位置插入字符串 替换 截断操作 删除操作 清空字符串 Empty 去掉空格,支持去除开始,末尾及开始和末尾空格 赋值给其它字符

    2024年02月17日
    浏览(32)
  • 【C++】STL---vector基本用法介绍

    个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C++之路】💌 本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长,共同进步。🍓 vector 是 C++STL 中的一种 动态数组容器 ,用于存储和

    2024年02月16日
    浏览(46)
  • 【C++】STL---list基本用法介绍

    个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C++之路】💌 本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长,共同进步。🍓 list 是STL中的一种 容器 ,底层其实就是一个 双向链

    2024年02月16日
    浏览(43)
  • 【C++】C++入门必备知识详细讲解

    首先我们先要知道,C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库。本章将会带大家了解,C++是补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的。 在C/C++中,变量、函数等等都是大量存在的,这些变量、函数和类的名称

    2024年02月16日
    浏览(44)
  • 【c++】list详细讲解

    作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等 座右铭:松树千年终是朽,槿花一日自为荣。 目标:熟悉list库 毒鸡汤:你的脸上云淡风轻,谁也不知道你的牙咬得有多紧。 望小伙伴们点赞👍收藏✨加关注哟💕💕  今天咱们学习list,咱们还是依照官网来学习

    2024年02月20日
    浏览(28)
  • resize 详细讲解 C++

     resize 函数  是一个替换字符串长度的函数,有两个重载函数,第一个参数都是替换之后的大小,第二个为替换的字母。 初始字符串123456   resize(n)中的n 比原来的长度小     resize(n)中的n 比原来的长度大,空字符为‘\\0’    a.resize(12,\\\'a\\\') 将新扩展的空间填充为字符‘a\\\'   

    2024年02月17日
    浏览(36)
  • 差分详细讲解(C++)

    每日一句:平凡的我在人多的地方曾极力小心翼翼, 但不知从何时起 ,我不太在意别人的目光了。比起被人觉得是个怪人,我现在更害怕浪费时间。 差分就是前缀和的逆运算,如果你不懂什么是前缀和,看这里-前缀和详解 数组a:a[1], a[2], a[3], a[n] 数组b : b[1] ,b[2] , b[3], b[i] 使

    2024年02月03日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包