2017-10-16 70 views
3

在C++中,沒有讓我的析構函數虛擬是否仍然可以下注我的非多態基類的指針/引用?如何使用非多態基類downcast

+0

是*可能*,但可能必須使用'static_cast'或'reinterpret_cast'。 *但是,如果基類不是多態的,並且沒有虛析構函數,那麼可能繼承它並不是正確的選擇。也許你應該將基類作爲*成員*來代替?什麼是你想解決的*實際*問題? *爲什麼*你使用繼承? –

+0

因此,如果我的基類是非多態的(沒有虛擬方法/析構函數),我不能沮喪 – Adrika

+0

使用'dynamic_cast'是不可能的。 –

回答

1

虛擬析構函數與向下轉換無關。使析構函數變爲虛擬的目標是允許通過指向基地的安全刪除。可以使用static_cast進行

Base * ptr = new Derived; 
delete ptr; // undefined behavior if Base destructor isn't virtual 

向下轉換,對自己的責任

void processBase(Base * ptr) 
{ 
    // undefined behavior if ptr does not point to Derived 
    // object or some object that inherits from Derived 
    Derived * derived = static_cast<Derived *>(ptr); 
} 

還有dynamic_cast,將檢查是否沮喪的是合法的,但它要求鑄造表達指向(或引用)的多態對象(即具有至少一個聲明或繼承的虛函數的對象)。

5.2.7.6否則,V應的指針或一個多態型(10.3)

的左值如果鑄造表達式的類型是不是多態的,該程序將編譯失敗。總結 - 使析構函數虛擬化將使你的類變得多態,但是通過聲明任何其他虛擬成員函數也可以實現相同的效果。要使用dynamic_cast,您需要一個多態類型。

+0

非多態類型的'dynamic_cast'向下形成格式不正確。 – Oktalist

+0

這意味着我在理解標準中的措辭時遇到了問題。由於他們在本節中使用短語「v有指向cv2 D的類型指針」,在本節中,區分表達式的類型和尖銳對象的類型很重要,因此我假設需求引用完整類型的指針。然而,ideone拒絕非多態表達式類型,所以你是對的。 –