如何使用reinterpret_cast转换为c ++中的派生类指针

And*_*rei 6 c++ reinterpret-cast

这是我的测试示例:

struct base {
    virtual ~base(){}
    int x;
};

struct derived: public virtual base {
    base * clone() {
        return new derived;
    }
    derived(): s("a") {}
    std::string s;
};

int main () {
    derived d;
    base * b = d.clone();
    derived * t = reinterpret_cast<derived*>(b);
    std::cout << t->s << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它在我打印s的行崩溃.由于"b"是指向派生类的指针,因此reinterpret_cast应该可以正常工作.我想知道为什么它会崩溃.同时,如果我用dynamic_cast替换reinterpret_cast,那么它可以工作.

Die*_*lla 12

即使b是在这里动态类型的derived,你必须使用dynamic_cast.这是 dynamic_cast为了在运行时将基类的指针动态转换为派生类.

reinterpret_cast获取原始指针并将其视为派生类型.但是,由于virtual继承,必须对指针进行微调,以指向正确的方法调度表,这正是dynamic_cast将要执行的操作.