在C++中,沒有讓我的析構函數虛擬是否仍然可以下注我的非多態基類的指針/引用?如何使用非多態基類downcast
回答
虛擬析構函數與向下轉換無關。使析構函數變爲虛擬的目標是允許通過指向基地的安全刪除。可以使用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
,您需要一個多態類型。
非多態類型的'dynamic_cast'向下形成格式不正確。 – Oktalist
這意味着我在理解標準中的措辭時遇到了問題。由於他們在本節中使用短語「v有指向cv2 D的類型指針」,在本節中,區分表達式的類型和尖銳對象的類型很重要,因此我假設需求引用完整類型的指針。然而,ideone拒絕非多態表達式類型,所以你是對的。 –
- 1. Java中是否有任何非多態基類引用?
- 2. 動態強制轉換不適用於非多態基類嗎?
- 3. 如何區分LLVM PASS中的非多態類和多態類?
- 4. 如何避免downcast?
- 5. 類層次設計,避免從基類到派生類的downcast
- 6. 非多態和非抽象基類中的虛析構函數
- 7. 使用fillna,downcast和熊貓
- 8. 如何在非靜態類
- 9. 在C++中訪問具有不正確downcast的基類成員
- 10. 使基類具有多態性?
- 11. 如何使用多態性從基類訪問派生類向量成員?
- 12. 使用靜態或非靜態類
- 13. 多態性:基於模板的派生類的非模板化基礎,使用基指針
- 14. 多態性基類指針
- 15. Rails多態模型 - 基類
- 16. 使用多態性將派生類的值複製到基類
- 17. 基本類的基本多態指針
- 18. 使用非抽象類作爲基礎
- 19. 如何使用JSTL從Java類調用非靜態方法?
- 20. 如何擺脫使用Scala Actor的同步發送downcast?
- 21. C#:具有非多態類的動態多態性
- 22. Downcast Instantiated UITableViewCell
- 23. 如何使dijit.Dialog非模態
- 24. 如何讓基類對象調用派生類非虛函數?
- 25. 如何使用JPA 1.0執行非多態JPQL查詢?
- 26. 如何使用泛型參數擴展非靜態類?
- 27. 如何在靜態類中使用多態或繼承?
- 28. 使用非靜態方法中的內部類的靜態類
- 29. 如何在使用抽象類的java中使用多態性?
- 30. rankntypes:非法多態或限定類型
是*可能*,但可能必須使用'static_cast'或'reinterpret_cast'。 *但是,如果基類不是多態的,並且沒有虛析構函數,那麼可能繼承它並不是正確的選擇。也許你應該將基類作爲*成員*來代替?什麼是你想解決的*實際*問題? *爲什麼*你使用繼承? –
因此,如果我的基類是非多態的(沒有虛擬方法/析構函數),我不能沮喪 – Adrika
使用'dynamic_cast'是不可能的。 –