यहाँ पर एक प्रकार का जहाज़ है static_cast<>
और dynamic_cast<>
विशेष रूप से वे संकेत से संबंधित हैं। यह सिर्फ 101-स्तरीय रंडाउन है, यह सभी पेचीदगियों को कवर नहीं करता है।
static_cast <टाइप *> (ptr)
यह पॉइंटर को अंदर ले जाता है ptr
और सुरक्षित रूप से टाइप के पॉइंटर में डालने की कोशिश करता है Type*
। यह कलाकार संकलन के समय किया जाता है। यह केवल कलाकारों का प्रदर्शन करेगा यदि प्रकार प्रकार संबंधित हैं। यदि प्रकार संबंधित नहीं हैं, तो आपको संकलक त्रुटि मिलेगी। उदाहरण के लिए:
class B {};
class D : public B {};
class X {};
int main()
{
D* d = new D;
B* b = static_cast<B*>(d); // this works
X* x = static_cast<X*>(d); // ERROR - Won't compile
return 0;
}
डायनामिक_कास्ट <टाइप *> (पीटीआर)
यह फिर से पॉइंटर को अंदर ले जाने की कोशिश करता है ptr
और सुरक्षित रूप से टाइप के पॉइंटर में डाल देता है Type*
। लेकिन इस कास्ट को रन टाइम पर निष्पादित किया जाता है, संकलन समय पर नहीं। क्योंकि यह एक रन-टाइम कास्ट है, यह विशेष रूप से उपयोगी है जब पॉलीमॉर्फिक वर्गों के साथ जोड़ा जाता है। वास्तव में, प्रमाणित मामलों में कलाकारों को कानूनी होने के लिए वर्गों को बहुरूपी होना चाहिए।
जातियां दो दिशाओं में से एक में जा सकती हैं: आधार से व्युत्पन्न (बी 2 डी) या व्युत्पन्न से आधार (डी 2 बी) तक। यह देखना काफी आसान है कि D2B कास्ट रनटाइम पर कैसे काम करेगा। या तो ptr
से लिया गया था Type
या यह नहीं था। D2B डायनेमिक_कास्ट <> s के मामले में, नियम सरल हैं। आप किसी भी चीज़ के लिए कुछ भी करने की कोशिश कर सकते हैं, और अगर ptr
वास्तव में इससे प्राप्त हुआ था Type
, तो आपको एक Type*
पॉइंटर वापस मिलेगा dynamic_cast
। अन्यथा, आपको एक NULL पॉइंटर मिलेगा।
लेकिन बी 2 डी कास्ट थोड़ा अधिक जटिल है। निम्नलिखित कोड पर विचार करें:
#include <iostream>
using namespace std;
class Base
{
public:
virtual void DoIt() = 0; // pure virtual
virtual ~Base() {};
};
class Foo : public Base
{
public:
virtual void DoIt() { cout << "Foo"; };
void FooIt() { cout << "Fooing It..."; }
};
class Bar : public Base
{
public :
virtual void DoIt() { cout << "Bar"; }
void BarIt() { cout << "baring It..."; }
};
Base* CreateRandom()
{
if( (rand()%2) == 0 )
return new Foo;
else
return new Bar;
}
int main()
{
for( int n = 0; n < 10; ++n )
{
Base* base = CreateRandom();
base->DoIt();
Bar* bar = (Bar*)base;
bar->BarIt();
}
return 0;
}
main()
यह नहीं बता सकता है कि किस प्रकार की वस्तु CreateRandom()
वापस आएगी, इसलिए सी-स्टाइल कास्ट Bar* bar = (Bar*)base;
निश्चित रूप से टाइप-सुरक्षित नहीं है। आप इसे कैसे ठीक कर सकते हैं? एक तरीका यह bool की तरह एक समारोह को जोड़ने के लिए किया जाएगा AreYouABar() const = 0;
आधार वर्ग के लिए और वापसी true
से Bar
और false
से Foo
। लेकिन एक और तरीका है: उपयोग dynamic_cast<>
:
int main()
{
for( int n = 0; n < 10; ++n )
{
Base* base = CreateRandom();
base->DoIt();
Bar* bar = dynamic_cast<Bar*>(base);
Foo* foo = dynamic_cast<Foo*>(base);
if( bar )
bar->BarIt();
if( foo )
foo->FooIt();
}
return 0;
}
कलाकार रनटाइम पर निष्पादित करते हैं, और ऑब्जेक्ट को क्वेरी करके काम करते हैं (अब के लिए चिंता करने की कोई ज़रूरत नहीं है), यह पूछते हुए कि क्या यह वह प्रकार है जिसकी हम तलाश कर रहे हैं। यदि यह है, dynamic_cast<Type*>
एक सूचक लौटाता है; अन्यथा यह NULL को लौटाता है।
बेस-टू-व्युत्पन्न कास्टिंग का उपयोग करने के लिए काम करने के लिए dynamic_cast<>
, बेस, फू और बार होना चाहिए जो मानक कॉल पॉलीमॉर्फिक प्रकार कहते हैं । बहुरूपी प्रकार होने के लिए, आपकी कक्षा में कम से कम एक virtual
कार्य होना चाहिए । यदि आपकी कक्षाएं बहुरूपी प्रकार नहीं हैं, तो dynamic_cast
वसीयत का आधार-से-व्युत्पन्न उपयोग संकलित नहीं होगा। उदाहरण:
class Base {};
class Der : public Base {};
int main()
{
Base* base = new Der;
Der* der = dynamic_cast<Der*>(base); // ERROR - Won't compile
return 0;
}
आधार के लिए एक आभासी फ़ंक्शन जोड़ना, जैसे कि वर्चुअल डोर, बेस और डेर पॉलीमॉर्फिक दोनों प्रकार बनाएगा:
class Base
{
public:
virtual ~Base(){};
};
class Der : public Base {};
int main()
{
Base* base = new Der;
Der* der = dynamic_cast<Der*>(base); // OK
return 0;
}
dynamic_cast<>
कि पर्दे के पीछे कैसे काम करता है (या C ++ कितना काम करता है), एक अच्छी किताब (जो कि कुछ तकनीकी के लिए पढ़ना बहुत आसान है) है Lippman का "इनसाइड द C ++ ऑब्जेक्ट मॉडल"। इसके अलावा स्ट्रॉस्ट्रुप की "डिजाइनिंग एंड एवोल्यूशन ऑफ सी ++" और "द सी ++ प्रोग्रामिंग लैंग्वेज" किताबें अच्छे संसाधन हैं, लेकिन लिपमैन की किताब 'सी + +' पर्दे के पीछे कैसे काम करती है, इसके लिए समर्पित है।