reinterpret_cast,投到兄弟班

reinterpret_cast, casting to brother class

本文关键字:兄弟 cast reinterpret      更新时间:2023-10-16

我只是想知道以下C++代码是否保证有效:

struct B1 {
    virtual void f() {};
};
struct B2 {
    virtual void f2() {};
};
struct D:public B1,public B2 {
};
int main() {
    D d;
    B1 *b1=&d;
    if (dynamic_cast<B2*>(b1)) {
      B2* b2 = reinterpret_cast<B2*>(b1); //is this conversion valid?
    };
    return 1;
};

当然,你会为什么我需要这个?因为我想替换这个:

C::C(B1* b): member(dynamic_cast<B2*>(b)?dynamic_cast<B2*>(b)->m():b) {};

具有更好的结构(通过性能,不检查类型安全性两次):

C::C(B1* b): member(dynamic_cast<B2*>(b)?reinterpret_cast<B2*>(b)->m():b) {};

提前感谢!

软件问题的解决方案通常是添加间接级别,在本例中为函数。假设dynamic_cast应该是 B2*(而不是 B1),编写一个执行正确操作的函数:

B1 *get_b(B1 *b) {
    B2 *b2 = dynamic_cast<B2*>(b);
    if (b2)
        return b2->m();
    else
        return b;
}

然后在初始值设定项列表中使用该函数:

C::C(B1 *b) : member(get_b(b)) { }

不,这绝对是无效的。您只能安全地使用 reinterpret_cast 将其转换回原始类型;其他任何内容都是实现定义的。