-4

我只是想知道以下 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) {};

提前致谢!

4

2 回答 2

5

软件问题的解决方案通常是添加一个间接级别,在这种情况下是一个函数。假设 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)) { }
于 2012-08-15T19:17:57.963 回答
4

不,这绝对是无效的。使用 reinterpret_cast 您可以安全地做的就是将其转换回原始类型;其他任何东西都是实现定义的。

于 2012-08-15T19:05:53.090 回答