如何在构造函数中触发gcc __dynamic_cast的whole_prefix->whole_type != whole_type分支?
触发GCC __dynamic_cast指定分支的构造函数场景示例
以下是能触发你提到的whole_prefix->whole_type != whole_type分支并返回NULL的代码示例:
#include <iostream> // 前向声明 struct D; struct B { // 空构造函数 B() = default; }; struct A { A() { // 注意:此处static_cast仅用于构造触发分支的场景,实际属于未定义行为 // 模拟源指针为独立基类B的指针 B* b_ptr = static_cast<B*>(static_cast<D*>(this)); // 尝试从B*动态转换为D* D* d_ptr = dynamic_cast<D*>(b_ptr); std::cout << "A构造函数中dynamic_cast结果: " << d_ptr << std::endl; } }; // D同时继承独立基类B和主基类A(构造顺序先B后A) struct D : public B, public A { D() = default; }; int main() { D d; return 0; }
场景说明
- 构造顺序:
D的构造顺序是先构造基类B,再构造基类A,最后执行D自身的构造逻辑。 - 触发条件:在
A的构造函数执行时,当前对象的动态类型是A(而非完整的D),此时尝试将指向D的B部分的指针(独立基类指针)dynamic_cast为D*。 - 分支触发原因:GCC的
__dynamic_cast在处理构造/析构期间的类型转换时,会检查完整对象的类型与源指针对应的前缀类型。此时源指针的whole_prefix->whole_type为B,而当前对象的whole_type还未完全变为D(仍处于A的构造阶段),两者不相等,因此返回NULL。
运行该代码,GCC环境下会输出类似A构造函数中dynamic_cast结果: 0,即返回NULL,符合注释描述的场景。
内容的提问来源于stack exchange,提问作者xxllxx666
相关产品推荐
相关产品推荐

