簡體   English   中英

為什么我要使用 dynamic_cast 來強制轉換為 void *?

[英]Why would I use dynamic_cast to cast TO a void *?

所以我正在閱讀來自 "void *" 的 dynamic_cast的答案,雖然你不能從void *轉換為T *一些響應指出可以將T *轉換為void * ,但不要沒有任何跡象表明你為什么要這樣做。

這只是可能的一些瑣事,還是有可能有意義? 我考慮過可能是為了可讀性或明確表示我們正在轉換為void * ,但考慮到dynamic_cast的目的,它不太適合我。

就此而言,除了讓T * void *隱式變為void *之外,還有什么理由可以做任何事情嗎? 我已經看到 C 風格的轉換為void *不時用於這個目的,我認為只是明確的(假設我們沒有做一些不尋常的事情,比如將int轉換為指針或其他東西)。

首先,當使用dynamic_cast<void*>(x)您會得到一個指向最派生對象的第一個字節的指針。 只要x的靜態類型是多態的。

這在少數場景中很有用,其中地址用作對象標識:

  • 您現在有一種方法可以將指向同一對象的子對象的指針與指向不相關子對象的指針完全區分開來。
  • 您現在可以走一些扭曲的圖形,而無需多次訪問同一個對象...可用於序列化

當然,這當然不是日常使用,但在 C++ 中,內存地址是對象的事實上的標識符,因此從繼承層次結構的任何部分訪問它的機制對於那些少數極端情況肯定是有用的。

這是有目的的,有點。 在允許它的規范部分中暗示了它。 來自 N3337,第 5.2.7 節,第 7 段:

如果 T 是“指向 cv void 的指針”,則結果是指向 v 指向的最派生對象的指針。

所以dynamic_cast<void*>(...)實際上是static_cast<void*>(dynamic_cast<MostDerivedType*>(...))簡寫。 這將是有用的......有點。

使其有用的困難在於您不一定知道MostDerivedType是什么。 畢竟,每個表達式都可能不同。 因此,一旦將其作為void* ,您就不一定有辦法安全地將其恢復。 如果您對MostDerivedType進行猜測並且只是static_cast它,並且您錯了,那么您就處於未定義的行為領域。 而如果您對該類型執行dynamic_cast (然后static_castvoid* ),如果它不是該類型,它至少會返回 NULL 。

所以不,我會說它不是很有用。 如果您想生活在 C++ 的邊界內並且不依賴於潛在的未定義行為,則不是。

它在為運算符newdelete實現包裝器時很有用。 問題是操作符delete允許我們使用指向多態對象基址的指針來釋放內存。 在這種情況下,包裝器不知道哪個對象真正在那里被釋放(在包裝器之前分配的所有對象中)。 所以我們使用dynamic_cast< void * >()作為對象的唯一標識 - 它轉換為多態對象的最派生類型。 這允許我們跟蹤當前通過此包裝器分配的所有對象。 這種包裝器可用於內存分配跟蹤和批量釋放。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM