सी ++ मल्टीपल, मल्टीलेवल और पदानुक्रमित वंशानुक्रम

इस लेख में, आप C ++ प्रोग्रामिंग में विरासत के विभिन्न मॉडलों के बारे में जानेंगे: उदाहरणों के साथ एकाधिक, बहुस्तरीय और श्रेणीबद्ध विरासत।

विरासत वस्तु-उन्मुख प्रोग्रामिंग भाषा की मुख्य विशेषता में से एक है। यह सॉफ्टवेयर डेवलपर्स को मौजूदा वर्ग से एक नया वर्ग प्राप्त करने की अनुमति देता है। व्युत्पन्न वर्ग को आधार वर्ग (मौजूदा वर्ग) की विशेषताएं विरासत में मिली हैं।

C ++ प्रोग्रामिंग में वंशानुक्रम के विभिन्न मॉडल हैं।

C ++ मल्टीलेवल इनहेरिटेंस

C ++ प्रोग्रामिंग में, आप न केवल आधार वर्ग से एक वर्ग प्राप्त कर सकते हैं, बल्कि आप व्युत्पन्न वर्ग से एक वर्ग भी प्राप्त कर सकते हैं। वंशानुक्रम के इस रूप को बहुस्तरीय विरासत के रूप में जाना जाता है।

कक्षा (… ); वर्ग बी: सार्वजनिक ए (…); क्लास सी: पब्लिक बी (………);

यहाँ, वर्ग B को आधार वर्ग A से और वर्ग C को व्युत्पन्न वर्ग B से लिया गया है।

उदाहरण 1: C ++ मल्टीलेवल इनहेरिटेंस

 #include using namespace std; class A ( public: void display() ( cout<<"Base class content."; ) ); class B : public A ( ); class C : public B ( ); int main() ( C obj; obj.display(); return 0; )

आउटपुट

 आधार वर्ग सामग्री।

इस कार्यक्रम में, क्लास सी को क्लास बी (जो बेस क्लास ए से लिया गया है) से लिया गया है।

main()फ़ंक्शन में क्लास सी की ओब्जेक्ट ऑब्जेक्ट को परिभाषित किया गया है।

जब display()फ़ंक्शन को बुलाया जाता है, तो display()कक्षा ए में निष्पादित किया जाता है। ऐसा इसलिए है क्योंकि display()क्लास सी और क्लास बी में कोई फंक्शन नहीं है ।

कंपाइलर पहली बार display()सी में फ़ंक्शन के लिए दिखता है । चूंकि फ़ंक्शन वहां मौजूद नहीं है, यह क्लास बी में फ़ंक्शन के लिए दिखता है (जैसा कि सी बी से लिया गया है)।

यह फ़ंक्शन क्लास बी में भी मौजूद नहीं है, इसलिए कंपाइलर इसे क्लास ए में देखता है (जैसा कि बी ए से लिया गया है)।

यदि display()फ़ंक्शन सी में मौजूद है, तो कंपाइलर display()क्लास ए (सदस्य फ़ंक्शन ओवरराइडिंग के कारण) से ओवरराइड करता है।

सी ++ मल्टीपल इनहेरिटेंस

C ++ प्रोग्रामिंग में, एक वर्ग को एक से अधिक माता-पिता से प्राप्त किया जा सकता है। उदाहरण के लिए: एक वर्ग चमगादड़ आधार वर्ग स्तनपायी और विंगडाइनल से लिया गया है। यह समझ में आता है क्योंकि चमगादड़ एक स्तनधारी के साथ-साथ एक पंख वाला जानवर भी है।

उदाहरण 2: C ++ प्रोग्रामिंग में मल्टीपल इनहेरिटेंस

 #include using namespace std; class Mammal ( public: Mammal() ( cout << "Mammals can give direct birth." << endl; ) ); class WingedAnimal ( public: WingedAnimal() ( cout << "Winged animal can flap." << endl; ) ); class Bat: public Mammal, public WingedAnimal ( ); int main() ( Bat b1; return 0; ) 

आउटपुट

स्तनधारी प्रत्यक्ष जन्म दे सकते हैं। पंख वाला जानवर फ्लैप कर सकता है।

एकाधिक वंशानुक्रम में अस्पष्टता

फ़ंक्शन ओवरराइडिंग के दौरान एकाधिक वंशानुक्रम के साथ सबसे स्पष्ट समस्या होती है।

मान लीजिए, दो आधार वर्गों का एक ही कार्य होता है जो व्युत्पन्न वर्ग में अतिप्रचलित नहीं है।

यदि आप व्युत्पन्न वर्ग के ऑब्जेक्ट का उपयोग करके फ़ंक्शन को कॉल करने का प्रयास करते हैं, तो संकलक त्रुटि दिखाता है। यह इसलिए है क्योंकि संकलक को यह पता नहीं है कि किस फ़ंक्शन को कॉल करना है। उदाहरण के लिए,

 class base1 ( public: void someFunction( ) (… .… … . ) ); class base2 ( void someFunction( ) (… .… … . ) ); class derived : public base1, public base2 ( ); int main() ( derived obj; obj.someFunction() // Error! )  

बेस 1 या बेस 2 को किस फंक्शन में रखा जाए, यह बताने के लिए स्कोप रेजोल्यूशन फंक्शन का उपयोग करके इस समस्या को हल किया जा सकता है

 int main () (obj.base1 :: someFunction (); // बेस 1 क्लास के फंक्शन को obj.base2 :: someFunction (); // बेस 2 क्लास का फंक्शन कहा जाता है।)

सी ++ पदानुक्रमित वंशानुक्रम

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

उदाहरण के लिए: भौतिक विज्ञान, रसायन विज्ञान, जीवविज्ञान विज्ञान वर्ग से लिए गए हैं।

पदानुक्रमित वंशानुक्रम का सिंटैक्स

 वर्ग base_class (…) वर्ग first_derived_class: सार्वजनिक base_class (…) वर्ग second_derived_class: सार्वजनिक base_class (…) वर्ग third_derived_class: सार्वजनिक base_class (…)

दिलचस्प लेख...