तुलना चार्ट
तुलना के लिए आधार | एकल वंशानुक्रम | एकाधिक वंशानुक्रम |
---|---|---|
बुनियादी | व्युत्पन्न वर्ग को एक एकल आधार वर्ग विरासत में मिला है। | व्युत्पन्न वर्ग को दो या दो से अधिक आधार वर्ग विरासत में मिलते हैं। |
कार्यान्वयन | वर्ग der_class: access_specifier आधार वर्ग | वर्ग व्युत्पन्न _class: access_specifier base_class1, access_specifier base_class2, .... |
पहुंच | व्युत्पन्न वर्ग एकल आधार वर्ग की सुविधाओं का उपयोग करता है | व्युत्पन्न आधार वर्गों की संयुक्त सुविधाओं को व्युत्पन्न वर्ग तक पहुँचाता है |
दृश्यता | सार्वजनिक, निजी, संरक्षित | सार्वजनिक, निजी, संरक्षित |
भागो समय | सिर पर रन टाइम की थोड़ी मात्रा की आवश्यकता होती है | एकल वंशानुक्रम की तुलना में अतिरिक्त रनवे ओवरहेड की आवश्यकता होती है |
एकल वंशानुक्रम की परिभाषा
एकल वंशानुक्रम में, एकल आधार वर्ग और एकल व्युत्पन्न वर्ग होता है। व्युत्पन्न वर्ग आधार वर्ग को या तो सार्वजनिक, संरक्षित और निजी रूप से विरासत में देता है। बेस क्लास के सदस्यों को आधार वर्ग की विरासत के दौरान निर्दिष्ट पहुंच निर्दिष्ट के अनुसार व्युत्पन्न वर्ग द्वारा पहुँचा जा सकता है।
चलो एक वास्तविक जीवन उदाहरण है हमारे पास दो वर्ग हैं, एक "खाता वर्ग" और "बचत खाता वर्ग"। यहाँ पर "सेविंग अकाउंट क्लास", "अकाउंट क्लास" की विशेषता को ले सकता है, इसलिए "अकाउंट क्लास" क्लास, अकाउंट क्लास को बचाने के लिए बेस / सुपर / पैरेंट क्लास बन जाएगा, और "सेविंग अकाउंट क्लास" एक व्युत्पन्न क्लास होगी।
यहाँ "खाता वर्ग की" विशेषताएँ acc_no (निजी) और बैलेंस (सार्वजनिक) हैं, और सदस्य फ़ंक्शंस आरंभीकृत हैं (), get_accno () जो सार्वजनिक हैं। अब, "खाता वर्ग" को "खाता खाते को सहेजना" विरासत में मिला है, इसलिए "खाता वर्ग" के सभी सार्वजनिक सदस्य सीधे "खाता वर्ग" द्वारा पहुँचा जा सकता है। यह "खाता वर्ग" के सार्वजनिक सदस्य कार्यों के माध्यम से "खाता वर्ग" के निजी सदस्य तक पहुंच सकता है, लेकिन उन्हें सीधे एक्सेस नहीं कर सकता है।
एकल वंशानुक्रम का कार्यान्वयन:
# नाम स्थान std का उपयोग करना शामिल है; वर्ग खाता {int acc_no, ; सार्वजनिक: फ्लोट संतुलन; void initialize (int x, int y) {acc_no = x; संतुलन = y; } int get_accno। () {वापसी acc_no; }}; class Saving_acc: public account {float intrest_rate; public: // Saving_acc class का निर्माता Saving_acc (int c) {interest_rate = c; } शून्य प्रदर्शन () {cout <मल्टीपल इनहेरिटेंस की परिभाषा
एकाधिक वंशानुक्रम व्युत्पन्न वर्ग को एक से अधिक बेस क्लास की संयुक्त विशेषताओं को प्राप्त करने की अनुमति देता है अर्थात हमारे पास एकल व्युत्पन्न वर्ग और कई बेस क्लास हैं। प्रत्येक बेस क्लास को उनमें से प्रत्येक के लिए अलग एक्सेस स्पेसियर का उल्लेख करके विरासत में प्राप्त करना होगा। एक व्युत्पन्न वर्ग एक्सेस स्पेसियर के आधार पर बेस कक्षाओं के सदस्यों तक पहुंच सकता है जिसके द्वारा बेस क्लास विरासत में मिला है।
आइए इसे आसान बनाते हैं उदाहरण के साथ हमारे पास तीन वर्ग हैं बाइक, कार और वाहन। अब, "वाहन" "बाइक" के साथ-साथ "कार" की विशेषताओं को भी प्राप्त कर सकता है। तो, "वाहन" व्युत्पन्न वर्ग बन जाता है और "बाइक" और "कार" बेस क्लास बन जाता है। अब, "बाइक" और "कार" को सार्वजनिक रूप से "वाहन" द्वारा विरासत में मिला है, यह "बाइक" और "कार" के सभी सार्वजनिक सदस्यों तक पहुंच सकता है, लेकिन जैसा कि हमारे पास "कार" में एक इकाई Model_no संरक्षित है, इसलिए यह कार के लिए निजी है लेकिन हो सकता है "वाहन" द्वारा पहुँचा।
एकाधिक वंशानुक्रम का कार्यान्वयन:
# नाम स्थान std का उपयोग करना शामिल है; क्लास बाइक {int engine_cost; ; public: void set_engine_cost (int x) {engine_cost = x; }}; वर्ग कार {संरक्षित: int Model_no; सार्वजनिक: शून्य सेट_मॉडल_नो (इंट पी) {मॉडल_नो = पी; }}; वर्ग वाहन: सार्वजनिक बाइक, सार्वजनिक कार {int no_of_wheels सार्वजनिक: वाहन (int w) {no_of_wheels = w; cout << "पहियों का नहीं" <सिंगल और मल्टीपल इनहेरिटेंस के बीच मुख्य अंतर
- एकल वंशानुक्रम एक व्युत्पन्न वर्ग होता है, जिसमें एकल आधार वर्ग होता है, जबकि एकाधिक विरासत में, दो या दो से अधिक आधार वर्ग होते हैं, लेकिन एकल व्युत्पन्न वर्ग।
- मल्टीपल इनहेरिटेंस काफी भ्रामक है क्योंकि यहाँ एक एकल व्युत्पन्न वर्ग को दो या अधिक बेस क्लास विरासत में मिली हैं। यदि आधार वर्गों में एक ही नाम के साथ एक विशेषता या कार्य होता है, तो व्युत्पन्न वर्ग के लिए, यह पहचानना मुश्किल हो जाता है कि यह किस आधार वर्ग का गुण या कार्य है।
- ओवरहेड मुद्दे एकल विरासत के मामले में कम हैं। लेकिन बहु विरासत में वस्तु निर्माण या विनाश वर्ग पदानुक्रम में मूल वर्ग के कंस्ट्रक्टर और विध्वंसक को आमंत्रित करता है जो ओवरहेड को बढ़ाता है।
- एकल वंशानुक्रम विशेषज्ञता की ओर अधिक है। जबकि बहु विरासत सामान्यीकरण की ओर अधिक है।
- चूंकि एकल वंशानुक्रम में कम उपरि है, इसलिए एकाधिक वंशानुक्रम की तुलना में इसका रनटाइम कम है।
निष्कर्ष
वंशानुक्रम प्रोग्रामर के काम को आसान बनाता है जैसे कि एक वर्ग पहले से ही बना हुआ है यदि आवश्यक हो तो इसकी विशेषताओं को अन्य द्वारा अनुकूलित किया जा सकता है। हालांकि एक्सेस स्पेसियर एक निश्चित तरीके से बेस क्लास के सदस्यों तक पहुंच को सीमित करता है, लेकिन यह डेटा को अधिक सुरक्षित बनाता है। एकल वंशानुक्रम किसी भी तरह से अधिक सरल और कई वंशानुक्रम से लागू करना आसान है। वंशानुक्रम वस्तु कोड के आकार को कम करता है, लेकिन कार्यक्रम के रन समय को भी प्रभावित करता है।