能,但仅当基类是多态类型(含虚函数)且实际指向派生类对象时才成功;否则指针返回nullptr,引用抛std::bad_cast。
能,但仅当基类对象**实际指向的是该派生类(或其子类)的实例**,且基类至少有一个虚函数(即必须是多态类型)。否则 dynamic_cast 返回 nullptr(对指针)或抛出 std::bad_cast(对引用)。
这不是“强制转换”,而是运行时类型检查后的安全向下转型(downcast)。
error: cannot dynamic_cast ... because the base class is not polymorphic
nullptr,引用抛异常dynamic_cast 依赖 RTTI(Run-Time Type Information),而 C++ 只对**多态类型**(即含虚函数的类)生成 RTTI 数据。没有虚函数的类,编译器不插入 vtable 和类型描述信息,dynamic_cast 根本无从判断真实类型。
哪怕只加一个空的虚析构函数,也足以满足要求:
立即学习“C++免费学习笔记(深入)”;
class Base {
public:
virtual ~Base() = default; // ✅ 关键:让 Base 成为多态类型
};dynamic_cast 编译不过virtual void foo() = 0;)同样有效指针版本可判空,推荐用于不确定类型的场景;引用版本无法判空,适合你**确定类型一定匹配**、想让错误尽早暴露的场合。
Base* b = new Derived(); Derived* d1 = dynamic_cast(b); // ✅ 成功,d1 指向有效对象 Derived* d2 = dynamic_cast (new Base()); // ❌ d2 == nullptr try { Derived& d3 = dynamic_cast
(b); // ✅ OK Derived& d4 = dynamic_cast ( new Base()); // ❌ 抛 std::bad_cast } catch (const std::bad_cast& e) { // 处理错误 }
nullptr 再解引用try/catch
dynamic_cast&,引用绑定到临时对象可能延长其生命周期,但逻辑上仍危险频繁使用 dynamic_cast 往往是设计信号——比如需要根据类型分
支调用不同逻辑,这通常说明应该用虚函数重构。
std::variant + std::visit(C++17)更类型安全、无 RTTI 开销typeid(*ptr).name() 更轻量,但结果不跨平台static_cast 替代 dynamic_cast 做向下转型——它跳过运行时检查,出错就是未定义行为真正需要 dynamic_cast 的典型场景很窄:比如插件系统中接收通用接口指针,需临时提取某个具体扩展能力;或调试器/序列化框架中按需还原原始类型。其他时候,它大概率是设计拐点的提示灯。
# c++
# 为什么
# 多态
# 子类
# 析构函数
# try
# catch
# Error
# void
# 指针
# 虚函数
# 纯虚函数
# 接口
# class
# 对象
# 重构
# 派生类
# 的是
# 什么时候
# 这不是
# 能把
# 想让
# 不确定
# 报错
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
如何在Golang中使用time处理时间_Golang time时间解析与格式化方法
Windows如何拦截腾讯视频广告_Windows拦截腾讯视频广告方法【方法】
Win11怎么开启剪贴板历史记录_Windows11 Win+V键使用技巧
Win11视频默认播放器怎么改_Win11关联第三方播放器【步骤】
Win11怎么设置任务栏对齐方式_Windows11个性化任务栏行为
如何在 IIS 上为 ASP.NET 6 应用排除特定目录并交由 PHP 处理
Mac版Final Cut Pro入门_Mac视频剪辑基础操作【教程】
Windows10如何更改桌面图标间距_Win10注册表WindowMetrics修改
Win11怎么设置开机自动连接宽带_Windows11创建拨号连接计划任务
Win11怎么开启智能存储_Windows11存储感知自动清理文件
Win11鼠标灵敏度怎么调 Win11鼠标指针移动速度设置【教程】
Win11如何开启telnet服务 Win11启用Telnet客户端【步骤】
VSC怎么在PHP中调试MySQL_数据库交互排查技巧【教程】
Win11怎么关闭通知消息_屏蔽Windows 11右下角弹窗通知设置【详解】
Win11怎么关闭OneDrive同步_Win11取消自动备份文件【教程】
Python网络超时处理_健壮性设计说明【指导】
Win11怎么设置鼠标宏_Win11鼠标按键自定义编程教程【详解】
Python 模块的 __name__ 属性如何由导入方式决定?
Win11如何关闭游戏模式 Win11禁用Xbox Game Bar录制【优化】
Win11怎样激活系统密钥_Win11系统密钥激活步骤【攻略】
Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡时长设置【步骤】
Windows10如何查看蓝屏日志_Win10使用事件查看器分析Dump文件
Python多进程教程_multiprocessing模块实战
Win11任务栏颜色怎么改_Win11自定义任务栏配色设置【美化】
php下载安装包太大怎么下载_分卷压缩下载方法【教程】
Win11怎么设置ipv4地址_Windows 11固定静态IP地址配置教程【详解】
phpstudy本地环境mysql忘记密码_重置mysqlroot密码操作流程【解答】
Win11怎么开启远程桌面连接_Windows11系统属性远程设置
WindowsUSB驱动安装异常怎么办_USB驱动重建与恢复教程
php删除数据怎么软删除_添加is_del字段标记删除【技巧】
c++ reinterpret_cast怎么用 c++最危险的类型转换【详解】
php485返回数据不完整怎么办_php485数据分包重组处理方法【教程】
静态属性修改会影响所有实例吗_php作用域操作符下静态存储【教程】
Windows10电脑怎么设置防火墙出站规则_Win10禁止程序联网教程
Win10任务栏天气和资讯怎么关闭 Win10禁用新闻和兴趣功能【教程】
如何使用Golang操作指针变量_Golang解引用与赋值实践
如何使用Golang指针与接口结合_实现方法调用和动态类型
Win11讲述人怎么关闭_Win11误触开启语音朗读关闭【快捷键】
如何在Golang中处理模块包路径变化_Golang包重命名与导入方法
如何用::实现工具类方法调用_php静态工具类设计技巧【技巧】
Windows10系统更新错误0x80070002_Win10自动更新失败手动修复
Win11资源管理器卡顿怎么办 Win11文件资源管理器重启技巧【优化】
如何在Golang中实现并发消息队列消费者_Golang channel消息消费实践
如何使用Golang反射将map转换为struct_Golang reflect类型映射技巧
php订单日志怎么记录物流_php记录订单物流变更日志指南【指南】
php打包exe如何加密代码_防反编译保护方法【技巧】
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
Win11怎么压缩文件 Win11自带压缩解压功能使用【教程】
本地php环境出现502错误_nginx或apache502badgateway解决技巧【解答】
Win10如何卸载自带Edge_Win10彻底卸载Edge浏览器教程【攻略】
2026-01-04
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。