为何可对非虚类执行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
相关产品推荐
相关产品推荐

