2017-10-17 8 views
0

私は、次の継承構造を有する型消しゴム有する:繰り返し継承とはstatic_cast

     Holder 
    /     |   \ 
    |     |   | 
Holder_A_1   Holder_B_1 Holder_C_1 
    |     |   ... 
Holder_A_2   Holder_B_2 
    ...     ... 
    |     | 
Holder_A_base  Holder_B_base Holder_C_base 
    |     |   ... 
Holder_A_base_2 Holder_B_base_2 
    ...     ... 
    |     |    | 
Anchor    Anchor  Anchor 

(アンカーベースクラスは目的に繰り返される)

オブジェクトの構築時に、私はホルダー・オブジェクトを構築し保管と削除のためにAnchor *にキャストしてください。キャストは曖昧さ回避のためHolder_A_base*を介して行われます:static_cast<Holder_A_base*>(static_cast<Anchor*>(this))

私の質問は:私はHolderオブジェクトはこれらの両方から派生を消去されているという事実のために知っていれば、それはHolder_B_base*に(上記で説明したように構築)Anchor*からstatic_castに合法ですタイプ?

答えて

1

static_castからHolder_A_base_2 *Holder_B_base *に正当なものかを言い換えると、あなたの質問は分かりやすくなります。いいえ、そうではなく、コンパイルされません。

Anchor *からHolder_B_base *へのキャストは、Anchorオブジェクトが指し示されていない限り、Holder_B_baseの一部であるものを除いてコンパイルされますが、未定義ビヘイビアになります。

Anchor *から、それが含まれていないクラスにキャストする必要がある場合は、dynamic_castを使用できます。これにより、クロスキャストが可能になります。