博__主:米码收割机
技__能:C++/Python语言
公众号:测试开发自动化【获取源码+商业合作】
荣__誉:阿里云博客专家博主、51CTO技术博主
专__注:专注主流机器人、人工智能等相关领域的开发、测试技术。
C++中dynamic_cast基本用法(详细讲解)
目录
- C++中dynamic_cast基本用法(详细讲解)
- 1. 使用场景
- 1.1向下转型
- 1.2横向转型
- 2. 前提条件
- 3. 优点
- 4. 缺点
dynamic_cast
是 C++ 中的一个类型转换操作符,它主要用于多态类型之间的转换。其特点是在运行时进行类型检查,确保所执行的转换是安全的。因此,它主要用于指向类的指针或引用之间的转换,尤其是在类的继承体系中。
将基类指针或引用转换为派生类指针或引用。这是 dynamic_cast
最常见的用途。
class Base {};
class Derived : public Base {};
Base* basePtr = new Derived;
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
如果转换成功,derivedPtr
将是一个有效的指针;如果转换失败(例如,如果 basePtr
实际上不指向 Derived
类的对象),derivedPtr
将是 nullptr
。
在同一继承层级的不同派生类之间进行转换。
class Base {};
class Derived1 : public Base {};
class Derived2 : public Base {};
Base* basePtr = new Derived1;
Derived2* derived2Ptr = dynamic_cast<Derived2*>(basePtr);
在这种情况下,derived2Ptr
会是 nullptr
,因为 basePtr
实际上指向的是 Derived1
类的对象。
为了使 dynamic_cast
能够进行运行时类型检查,以下条件必须满足:
转换涉及的类型至少有一个虚函数。换句话说,基类必须有虚函数,以支持运行时类型信息 (RTTI)。
class Base {
public:
virtual void foo() {}
};
编译器需要启用 RTTI。大多数现代 C++ 编译器默认启用 RTTI,但有些情况下可能需要显式地开启它。
dynamic_cast
提供运行时的类型检查,这使得转换更加安全。如果转换无法进行,对于指针转换,它返回 nullptr
;对于引用转换,它抛出一个 std::bad_cast
异常。dynamic_cast
需要在运行时进行类型检查,所以它相对于其他转换(如 static_cast
)来说,有一定的性能开销。总之,dynamic_cast
在处理与多态相关的类型转换时是非常有用的,尤其是当你不确定实际类型时。但由于其性能开销,你应该在必要时才使用它,并确保 RTTI 在你的编译器中是启用的。