-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) {};

より良い構造で(型の安全性を2回チェックしないように、パフォーマンスによって):

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 に答える