【C++】dynamic

03-18 1184阅读

【C++】dynamic


👉博__主👈:米码收割机

👉技__能👈:C++/Python语言

👉公众号👈:测试开发自动化【获取源码+商业合作】

👉荣__誉👈:阿里云博客专家博主、51CTO技术博主

👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。


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


目录

  • C++中dynamic_cast基本用法(详细讲解)
  • 1. 使用场景
    • 1.1向下转型
    • 1.2横向转型
    • 2. 前提条件
    • 3. 优点
    • 4. 缺点

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

      1. 使用场景

      1.1向下转型

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

          class Base {};
          class Derived : public Base {};
          Base* basePtr = new Derived;
          Derived* derivedPtr = dynamic_cast(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(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 在你的编译器中是启用的。

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]