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

如何在构造函数中触发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;
}

场景说明

  1. 构造顺序:D的构造顺序是先构造基类B,再构造基类A,最后执行D自身的构造逻辑。
  2. 触发条件:在A的构造函数执行时,当前对象的动态类型是A(而非完整的D),此时尝试将指向D的B部分的指针(独立基类指针)dynamic_cast为D*。
  3. 分支触发原因:GCC的__dynamic_cast在处理构造/析构期间的类型转换时,会检查完整对象的类型与源指针对应的前缀类型。此时源指针的whole_prefix->whole_type为B,而当前对象的whole_type还未完全变为D(仍处于A的构造阶段),两者不相等,因此返回NULL。

运行该代码,GCC环境下会输出类似A构造函数中dynamic_cast结果: 0,即返回NULL,符合注释描述的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:40:17