You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何可对非虚类执行dynamic_cast?无虚函数代码编译原因

为什么类A无虚函数时这段代码仍能编译通过?

核心原因在于dynamic_cast的编译规则仅要求「被转换的源类型是多态类型」,目标类型是否为多态类型不影响编译通过性。

针对你的代码具体拆解:

  • 代码中的this是B*类型,而B类包含虚函数my_virtual(),属于多态类型,满足dynamic_cast编译的前置条件。
  • 尽管目标类型A没有虚函数(非多态类型),且A与B之间无任何继承关系,但C++标准允许这类转换通过编译。
  • 但运行时该转换必然失败,会直接返回nullptr——因为RTTI(运行时类型信息)无法验证B对象能否安全转换为A*,且两者无继承关系,转换逻辑不成立。

你认为编译器应该报错,大概率是混淆了dynamic_cast的两种场景:当转换目标是多态类型且无合法继承关系时,编译器会直接报错;但转换目标是非多态类型时,编译器不会拦截,仅会在运行时返回空指针。

内容的提问来源于stack exchange,提问作者Battlechicken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:30:11