programming - c++ example programs



एक बेस क्लास पॉइंटर एक व्युत्पन्न क्लास ऑब्जेक्ट को इंगित कर सकता है। इसके विपरीत क्यों सच नहीं है? (6)

अगर मैं आपको बताता हूं कि मेरे पास एक कुत्ता है, तो आप सुरक्षित रूप से यह मान सकते हैं कि मेरे पास पालतू जानवर है।

अगर मैं आपको बताता हूं कि मेरे पास पालतू जानवर है, तो आप नहीं जानते कि वह जानवर कुत्ता है, यह बिल्ली या शायद एक जिराफ भी हो सकता है। कुछ अतिरिक्त जानकारी जानने के बिना आप सुरक्षित रूप से यह नहीं मान सकते कि मेरे पास एक कुत्ता है।

इसी प्रकार एक व्युत्पन्न वस्तु एक बेस क्लास ऑब्जेक्ट है (क्योंकि यह एक उप वर्ग है), इसलिए इसे बेस क्लास पॉइंटर द्वारा इंगित किया जा सकता है। हालांकि, बेस क्लास ऑब्जेक्ट एक व्युत्पन्न क्लास ऑब्जेक्ट नहीं है, इसलिए इसे व्युत्पन्न क्लास पॉइंटर को असाइन नहीं किया जा सकता है।

(जो क्रैकिंग आप अब सुनेंगे वह समानता है)

मान लीजिए कि अब आप मुझे अपने पालतू जानवर के लिए एक उपहार खरीदना चाहते हैं।

पहले परिदृश्य में आप जानते हैं कि यह एक कुत्ता है, आप मुझे एक पट्टा खरीद सकते हैं, हर कोई खुश है।

दूसरे परिदृश्य में मैंने आपको यह नहीं बताया है कि मेरा पालतू जानवर क्या है यदि आप मुझे एक उपहार खरीदने जा रहे हैं, फिर भी आपको उस जानकारी को जानने की ज़रूरत है जिसे मैंने आपको नहीं बताया है (या बस अनुमान लगाया है), तो आप मुझे एक पट्टा खरीदते हैं, अगर यह बाहर निकलता है मैं वास्तव में एक कुत्ता था हर कोई खुश है।

हालांकि अगर मैं वास्तव में एक बिल्ली था तो अब हम जानते हैं कि आपने एक बुरी धारणा (कास्ट) बनाई है और एक पट्टा (रनटाइम त्रुटि) पर एक दुखी बिल्ली है।

एक बेस क्लास पॉइंटर एक व्युत्पन्न क्लास ऑब्जेक्ट को इंगित कर सकता है। कास्टिंग के बिना विपरीत क्यों सच नहीं है? तार्किक रूप से एक बेस क्लास में व्युत्पन्न वर्ग की पर्याप्त जानकारी नहीं होगी लेकिन व्युत्पन्न वर्ग में बेस क्लास की जानकारी भी होनी चाहिए। मुझे यहां कुछ मूलभूत बातें याद आ रही हैं।


ओह, क्योंकि बेस क्लास व्युत्पन्न वर्ग नहीं है।

जब आपके पास एक प्रकार के लिए एक वैध सूचक है, तो आप कह रहे हैं कि ऑब्जेक्ट की ओर इशारा करते हुए कुछ स्थानों में कुछ डेटा होगा ताकि हम इसे पा सकें। यदि आपके पास व्युत्पन्न ऑब्जेक्ट के लिए पॉइंटर है, तो आप गारंटी दे रहे हैं कि ऑब्जेक्ट-ऑब्जेक्ट में सभी व्युत्पन्न डेटा सदस्यों को शामिल किया गया है- लेकिन जब आप किसी आधार पर इंगित करते हैं, तो इसका असर यह नहीं होता है और खराब चीजें होती हैं।

हालांकि, व्युत्पन्न एक ही स्थान पर सभी बेस डेटा सदस्यों की गारंटी है। यही कारण है कि आधार के लिए एक सूचक वास्तव में व्युत्पन्न इंगित कर सकते हैं।


चूंकि बेस क्लास पॉइंटर बेस क्लास या किसी व्युत्पन्न प्रकार के उदाहरण को इंगित कर सकता है। एक व्युत्पन्न सूचक केवल उस व्युत्पन्न प्रकार या इसके किसी भी उप-वर्ग को इंगित कर सकता है।

struct Base {};
struct Derived : Base {};
struct Derived2 : Base {};
Base* p = new Derived(); //Fine, Derived inherits from Base
Derived* d = new Base(); //Not fine, Base is not an instance of nor derived from Derived.
Derived* d2 = new Derived2(); // Also not fine, Derived2 derives from Base, but is not related to Derived.

जहां तक ​​जाता है: आम तौर पर बेस पॉइंटर व्युत्पन्न सूचक से अधिक सामान्य होता है। जैसे कि यह विरासत प्रकार के बारे में कम जानता है। एक व्युत्पन्न सूचक को आधार के बिना किसी मूल प्रकार के पॉइंटर को असाइन नहीं किया जा सकता है क्योंकि यह बता नहीं सकता कि बेस पॉइंटर व्युत्पन्न प्रकार या उसके बच्चों में से एक है या नहीं।


चूंकि सी ++ एक स्थाई रूप से टाइप की गई भाषा है, और अंतर्निहित बेस-टू-व्युत्पन्न रूपांतरणों को टाइप सिस्टम को तोड़ देगा। Bjarne Stroustrup किसी भी "संदेश समझ में नहीं आया" रनटाइम त्रुटियों को नहीं चाहता था।


यह मान्य है, क्योंकि बाघ एक जानवर है:

    Animal * pAnimal = new Tiger();

यह मान्य नहीं है, क्योंकि यह सच नहीं है कि वस्तु एक जहर डार्ट मेंढक है।

    PoisonDartFrog * pPoisonDartFrog = new GenericFrog();

हमारे पास दो वस्तुएं हैं।

class A {
   int a;
};

class B : A {
   int b;
};

B का एक उदाहरण आवंटित करें। हम इसके साथ एक A* या B* रूप में इंटरफेस कर सकते हैं।

A का A उदाहरण आवंटित करें। अगर हम इसे B* डालना चाहते थे, तो सदस्य b लिए आवंटित स्थान होना चाहिए?





c++