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

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


👉博__主👈:米码收割机

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

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

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

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



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 在你的编译器中是启用的。


相关文章
Gradle安装配置下载
Gradle安装配置下载
833 1
C++ 捕获所有异常并拿到错误原因的方法
C++ 捕获所有异常并拿到错误原因的方法
448 0
|
存储 前端开发 安全
C++一分钟之-未来与承诺:std::future与std::promise
【6月更文挑战第27天】`std::future`和`std::promise`是C++异步编程的关键工具,用于处理未完成任务的结果。`future`代表异步任务的结果容器,可阻塞等待或检查结果是否就绪;`promise`用于设置`future`的值,允许多线程间通信。常见问题包括异常安全、多重获取、线程同步和未检查状态。解决办法涉及智能指针管理、明确获取时机、确保线程安全以及检查未来状态。示例展示了使用`std::async`和`future`执行异步任务并获取结果。
542 2
|
存储 安全 网络协议
|
数据可视化 编译器 Python
Manim:数学可视化的强大工具 | python小知识
Manim(Manim Community Edition)是由3Blue1Brown的Grant Sanderson开发的数学动画引擎,专为数学和科学可视化设计。它结合了Python的灵活性与LaTeX的精确性,支持多领域的内容展示,能生成清晰、精确的数学动画,广泛应用于教育视频制作。安装简单,入门容易,适合教育工作者和编程爱好者使用。
2834 7
|
存储 数据管理 Linux
Linux命令reposync详解
`reposync`是Linux的命令行工具,用于同步远程YUM仓库到本地,便于离线部署和更新软件。它从远程索引中识别新、改、删包,下载到指定目录,支持配置文件、多参数定制,如`-c`指定配置,`-r`选择仓库,`-p`设定下载路径。`-n`仅同步最新包,`-q`减少输出。最佳实践包括定时同步、验证GPG签名和使用HTTPS。注意网络稳定性、磁盘空间及索引备份。
【Log4cpp】项目日志Log4cpp的简单使用
【Log4cpp】项目日志Log4cpp的简单使用
|
安全 程序员 编译器
static_cast与dynamic_cast到底是什么?
该文讨论C++中`static_cast`和`dynamic_cast`在处理子类与父类指针转换的情况。总结如下: 1. `static_cast`父类转子类:可能不安全,但不会报错。 2. `static_cast`子类转父类:安全,无错误。 3. `dynamic_cast`父类转子类:若父类有虚函数,运行时检查,成功返回子类指针,失败则为`nullptr`。 4. `dynamic_cast`子类转父类:安全,无错误。
378 0
|
JSON 数据格式 C++
C++ JSON库 nlohmann::basic_json::array 的用法
C++ JSON库 nlohmann::basic_json::array 的用法
1356 1
|
算法 Java Go
非启发式算法——旅行商问题(TSP)及其解决算法
非启发式算法——旅行商问题(TSP)及其解决算法
1432 0