static_cast का उपयोग उदाहरण पर ठीक है लेकिन reinterpret_cast नहीं है। क्योंकि reinterpret_cast vtable को परिवर्तित नहीं करता है।
नहीं, समस्या यह है कि reinterpret_cast
विरासत के बारे में पूरी तरह से अनजान है। यह केवल उसी पते को अपरिवर्तित वापस कर देगा। लेकिन static_cast
जानता है कि आप एक डाउनकास्ट कर रहे हैं: यानी बेस क्लास से एक व्युत्पन्न कक्षा में कास्टिंग। चूंकि यह जानता है कि दोनों प्रकार शामिल हैं, यह तदनुसार पते को समायोजित करता है, यानी, सही काम करता है।
आइए नाटक हमारे कार्यान्वयन बाहर देता है काल्पनिक OVERLAPPEDEX
वर्ग इस तरह एक आभासी समारोह है:
+------+------------+------------------+-------------+
| vptr | OVERLAPPED | AssociatedClient | ClientState |
+------+------------+------------------+-------------+
^
|
ptr
सूचक हम OVERLAPPED
subobject के लिए अंक दिया जाता है। reinterpret_cast
उसमें बदलाव नहीं करेगा। यह केवल प्रकार बदल जाएगा। जाहिर है, इस पते के माध्यम से OVERLAPPEDEX
वर्ग तक पहुंच आसानी से विनाश को खत्म कर देगी, क्योंकि इसके सबबजेक्ट्स के स्थान अब सब गलत हैं!
what we believe we have when we access OVERLAPPEDEX through the pointer
+------+------------+------------------+-------------+
| vptr | OVERLAPPED | AssociatedClient | ClientState |
+------+------+-----+------+-----------+------+------+------+
| vptr | OVERLAPPED | AssociatedClient | ClientState | <- what we actually have
+------+------------+------------------+-------------+
^
|
ptr
static_cast
कि एक OVERLAPPED*
OVERLAPPEDEX*
कन्वर्ट करने के लिए यह पता समायोजित करना चाहिए जानता है, और सही काम करता है:
+------+------------+------------------+-------------+
| vptr | OVERLAPPED | AssociatedClient | ClientState |
+------+------------+------------------+-------------+
^
|
ptr after static_cast
हालांकि, अगर मैं का उपयोग सी-शैली वहां पर डालें (reinterpret_cast नहीं), क्या यह भी गलत हो सकता है?
एक सी शैली डाली निम्नलिखित वह सफल होता है के पहले एक के रूप में परिभाषित किया गया है:
const_cast
static_cast
static_cast
, तो const_cast
reinterpret_cast
reinterpret_cast
, फिर const_cast
आप देख सकते हैं, एक static_cast
reinterpret_cast
से पहले की कोशिश की है, इसलिए इस मामले में, एक सी शैली डाली भी सही काम करना होगा।
More info
गारंटी नहीं। reinterpret_cast
पर क्या होता है इसके बारे में बहुत कम गारंटी है। मेरे द्वारा किए जाने वाले सभी कार्यान्वयनों को केवल उसी पते को अपरिवर्तित किया जाएगा।
मुझे सी ++ में बिल्कुल भी पता नहीं है, लेकिन मेरी समझ यह है कि "कास्ट दोबारा परिभाषित करें" का अर्थ है कि * * (destination_type *) और 'सी में मतलब होगा। संभवतः" स्थैतिक कलाकार "वास्तव में कक्षा संबंधों को लेता है खाता और संकलक को गैर-तुच्छ रूपांतरण कार्य करने की अनुमति देता है। –