2017-10-17 105 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 

(錨基類上重複目的)

一旦對象構造我構造一個Holder對象和將其轉換爲Anchor *進行存儲和刪除。演員是通過Holder_A_base*做了歧義:static_cast<Holder_A_base*>(static_cast<Anchor*>(this))

我的問題是:這是合法的static_castAnchor*(構成如上所述),以Holder_B_base*如果我知道一個事實,即從這兩刪除導出Holder對象類型?

回答

1

如果您將其重新設置爲「static_castHolder_A_base_2 *Holder_B_base *?」,您的問題更易於理解?不,它不會編譯。

Anchor *Holder_B_base *的投射將會編譯但將是未定義行爲,除非Anchor對象指向的是Holder_B_base的一部分。

如果您需要將其從任何Anchor *轉換爲不屬於的類別,則可以使用dynamic_cast。這允許十字架。