types inheritance c
उदाहरणों के साथ C ++ में सभी प्रकार के विरासत का अन्वेषण करें।
हमारे पिछले ट्यूटोरियल में, हमने C ++ में विरासत के बारे में सीखा। कक्षा के व्युत्पन्न होने के तरीके या वर्ग के आधार पर कितने आधार वर्ग होते हैं, इसके आधार पर, हमारे पास विरासत के प्रकार हैं:
- एकल वंशानुक्रम
- एकाधिक वंशानुक्रम
- मल्टीलेवल इनहेरिटेंस
- पदानुक्रमित वंशानुक्रम
- हाइब्रिड वंशानुक्रम
=> पूर्ण सी ++ ट्यूटोरियल सूची देखने के लिए यहां देखें।
आप क्या सीखेंगे:
वंशानुक्रम के प्रकार
नीचे दिए गए विभिन्न प्रकार की विरासत का एक सचित्र प्रतिनिधित्व है।
हम निम्न वर्गों में उदाहरणों के साथ प्रत्येक प्रकार की विरासत देखेंगे।
(1) एकल वंशानुक्रम
एकल वंशानुक्रम में, एक वर्ग केवल एक आधार वर्ग से प्राप्त होता है। इसका मतलब यह है कि केवल एक उपवर्ग है जो एक सुपरक्लास से लिया गया है।
एकल वंशानुक्रम आमतौर पर इस प्रकार घोषित किया जाता है:
class subclassname : accessspecifier superclassname { //class specific code; };
नीचे दिए गए एकल वंशानुक्रम का एक पूरा उदाहरण है।
#include #include using namespace std; class Animal { string name=''; public: int tail=1; int legs=4; }; class Dog : public Animal { public: void voiceAction() { cout<<'Barks!!!'; } }; int main() { Dog dog; cout<<'Dog has '< आउटपुट:
कुत्ते के 4 पैर हैं
कुत्ते की 1 पूंछ होती है
कुत्ता भौंकता है!!!
हमारे पास एक बेस एनिमल के रूप में एक क्लास एनिमल है जिसमें से हमने एक उपवर्ग कुत्ता निकाला है। क्लास डॉग को एनिमल क्लास के सभी सदस्य विरासत में मिलते हैं और इसे अपने गुणों को शामिल करने के लिए बढ़ाया जा सकता है, जैसा कि आउटपुट से देखा जाता है।
एकल वंशानुक्रम विरासत का सबसे सरल रूप है।
# 2) एकाधिक वंशानुक्रम
एकाधिक वंशानुक्रम चित्रात्मक रूप से नीचे दर्शाया गया है।
एकाधिक वंशानुक्रम विरासत का एक प्रकार है जिसमें एक वर्ग एक से अधिक वर्गों से प्राप्त होता है। जैसा कि ऊपर चित्र में दिखाया गया है, वर्ग C एक उपवर्ग है जिसमें कक्षा A और वर्ग B उसके माता-पिता के रूप में है।
वास्तविक जीवन के परिदृश्य में, एक बच्चा अपने पिता और माता से विरासत में मिला है। इसे एकाधिक वंशानुक्रम का उदाहरण माना जा सकता है।
हम एकाधिक वंशानुक्रम को प्रदर्शित करने के लिए नीचे दिए गए कार्यक्रम को प्रस्तुत करते हैं।
#include using namespace std; //multiple inheritance example class student_marks { protected: int rollNo, marks1, marks2; public: void get() { cout <> rollNo; cout <> marks1 >> marks2; } }; class cocurricular_marks { protected: int comarks; public: void getsm() { cout <> comarks; } }; //Result is a combination of subject_marks and cocurricular activities marks class Result : public student_marks, public cocurricular_marks { int total_marks, avg_marks; public: void display() { total_marks = (marks1 + marks2 + comarks); avg_marks = total_marks / 3; cout << '
Roll No: ' << rollNo << '
Total marks: ' << total_marks; cout << '
Average marks: ' << avg_marks; } }; int main() { Result res; res.get(); //read subject marks res.getsm(); //read cocurricular activities marks res.display(); //display the total marks and average marks }
आउटपुट:
रोल नंबर दर्ज करें: 25
दो उच्चतम अंक दर्ज करें: 40 50
CoCurricular गतिविधियों के लिए चिह्न दर्ज करें: 30
रोल नंबर: 25
कुल अंक: 120
औसत अंक: 40
उपर्युक्त उदाहरण में, हमारे पास तीन कक्षाएं हैं, जैसे कि student_mark, cocurricular_mark और Result। कक्षा student_mark छात्र के लिए विषय चिह्न पढ़ता है। कक्षा cocurricular_mark सह-पाठयक्रम गतिविधियों में छात्र के अंकों को पढ़ता है।
परिणाम वर्ग छात्र के लिए कुल अंकों के साथ-साथ औसत अंकों की गणना करता है।
इस मॉडल में, परिणाम वर्ग student_mark और cocurricular_marks से लिया गया है क्योंकि हम इस विषय के साथ-साथ पाठ्येतर गतिविधियों के निशान से परिणाम की गणना करते हैं।
यह कई विरासत को प्रदर्शित करता है।
हीरे की समस्या
हीरे की समस्या को नीचे चित्रित किया गया है:
sdlc में कार्यान्वयन चरण क्या है?
यहाँ, हमारे पास दो वर्गों फादर और मदर के लिए एक चाइल्ड क्लास है। बदले में, ये दो वर्ग, वर्ग व्यक्ति को विरासत में देते हैं।
जैसा कि चित्र में दिखाया गया है, क्लास चाइल्ड को दो बार क्लास पर्सन के लक्षण विरासत में मिलते हैं यानी एक बार पिता से और दूसरी बार माँ से। यह अस्पष्टता को जन्म देता है क्योंकि संकलक यह समझने में विफल रहता है कि किस रास्ते पर जाना है।
चूँकि यह परिदृश्य तब उत्पन्न होता है जब हमारे पास हीरे के आकार की विरासत होती है, इस समस्या को प्रसिद्ध रूप से 'कहा जाता है' द डायमंड प्रॉब्लम ”।
C ++ में कार्यान्वित डायमंड समस्या संकलन में अस्पष्टता त्रुटि का परिणाम है। हम मूल आधार वर्ग को आभासी बनाकर इस समस्या को हल कर सकते हैं। हम बहुरूपता पर अपने आगामी ट्यूटोरियल में 'वर्चुअल' कीवर्ड के बारे में अधिक जानेंगे।
# 3) मल्टीलेवल इनहेरिटेंस
बहुस्तरीय विरासत नीचे दी गई है।
बहुस्तरीय विरासत में, एक वर्ग दूसरे व्युत्पन्न वर्ग से प्राप्त होता है। यह उत्तराधिकार तब तक हो सकता है जब तक कि हमारा क्रियान्वयन आगे नहीं बढ़ जाता। उपरोक्त आरेख में, क्लास C को क्लास B से लिया गया है। क्लास B, क्लास A से बदले में है।
आइए हम मल्टीलेवल इनहेरिटेंस का एक उदाहरण देखते हैं।
#include #include using namespace std; class Animal { string name=''; public: int tail=1; int legs=4; }; class Dog : public Animal { public: void voiceAction() { cout<<'Barks!!!'; } }; class Puppy:public Dog{ public: void weeping() { cout<<'Weeps!!'; } }; int main() { Puppy puppy; cout<<'Puppy has '< आउटपुट:
पिल्ला के 4 पैर हैं
पिल्ला की 1 पूंछ होती है
पिल्ला कीड़े !!! पिल्ला रोता है !!
यहां हमने सिंगल इनहेरिटेंस के लिए उदाहरण को संशोधित किया जैसे कि एक नया वर्ग पिल्ला है जो क्लास डॉग से विरासत में मिला है जो बदले में क्लास एनिमल से विरासत में मिला है। हम देखते हैं कि क्लास पपी अपने से ऊपर के दोनों वर्गों के गुणों और विधियों को प्राप्त करता है और उनका उपयोग करता है।
# 4) हाइब्रिड इनहेरिटेंस
हाइब्रिड विरासत को नीचे दर्शाया गया है।
हाइब्रिड वंशानुक्रम आमतौर पर एक से अधिक प्रकार की विरासत का संयोजन होता है। उपरोक्त प्रतिनिधित्व में, हाइब्रिड वंशानुक्रम प्राप्त करने के लिए हमारे पास कई उत्तराधिकार (बी, सी, और डी) और बहुस्तरीय विरासत (ए, बी और डी) हैं।
आइए हम हाइब्रिड वंशानुक्रम का एक उदाहरण देखें।
#include #include using namespace std; //Hybrid inheritance = multilevel + multilpe class student{ //First base Class int id; string name; public: void getstudent(){ cout <> id >> name; } }; class marks: public student{ //derived from student protected: int marks_math,marks_phy,marks_chem; public: void getmarks(){ cout <>marks_math>>marks_phy>>marks_chem; } }; class sports{ protected: int spmarks; public: void getsports(){ cout <> spmarks; } }; class result : public marks, public sports{//Derived class by multiple inheritance// int total_marks; float avg_marks; public : void display(){ total_marks=marks_math+marks_phy+marks_chem; avg_marks=total_marks/3.0; cout << 'Total marks =' << total_marks << endl; cout << 'Average marks =' << avg_marks << endl; cout << 'Average + Sports marks =' << avg_marks+spmarks; } }; int main(){ result res;//object// res.getstudent(); res.getmarks(); res.getsports(); res.display(); return 0; }
आउटपुट:
छात्र आईडी और छात्र का नाम 25 वेद दर्ज करें
3 विषय अंक दर्ज करें: 89 88 87
खेल के निशान दर्ज करें: 40
कुल अंक = 264
औसत अंक = 88
औसत + खेल के अंक = 128
यहां हमारे पास चार कक्षाएं हैं यानी स्टूडेंट, मार्क्स, स्पोर्ट्स और रिजल्ट। मार्क्स छात्र वर्ग से लिए गए हैं। कक्षा के परिणाम मार्क्स और स्पोर्ट्स से प्राप्त होते हैं क्योंकि हम विषय के अंकों के साथ-साथ खेल के निशान से परिणाम की गणना करते हैं।
आउटपुट क्लास के परिणाम का एक ऑब्जेक्ट बनाकर उत्पन्न होता है जिसने तीनों वर्गों के गुणों का अधिग्रहण किया है।
ध्यान दें कि हाइब्रिड वंशानुक्रम में भी, कार्यान्वयन में 'डायमंड समस्या' हो सकती है जिसे 'आभासी' कीवर्ड का उपयोग करके हल किया जा सकता है जैसा कि पहले उल्लेख किया गया है।
# 5) पदानुक्रमित वंशानुक्रम
पदानुक्रमित विरासत में, एक से अधिक वर्ग एक ही आधार वर्ग से विरासत में मिला जैसा कि ऊपर के प्रतिनिधित्व में दिखाया गया है। यह इसे एक पदानुक्रम की संरचना देता है।
नीचे दिया गया उदाहरण है पदानुक्रमित विरासत का प्रदर्शन।
#include using namespace std; //hierarchical inheritance example class Shape // shape class -> base class { public: int x,y; void get_data(int n,int m) { x= n; y = m; } }; class Rectangle : public Shape // inherit Shape class { public: int area_rect() { int area = x*y; return area; } }; class Triangle : public Shape // inherit Shape class { public: int triangle_area() { float area = 0.5*x*y; return area; } }; class Square : public Shape // inherit Shape class { public: int square_area() { float area = 4*x; return area; } }; int main() { Rectangle r; Triangle t; Square s; int length,breadth,base,height,side; //area of a Rectangle std::cout <>length>>breadth; r.get_data(length,breadth); int rect_area = r.area_rect(); std::cout << 'Area of the rectangle = ' <base>>height; t.get_data(base,height); float tri_area = t.triangle_area(); std::cout <<'Area of the triangle = ' << tri_area<side; s.get_data(side,side); int sq_area = s.square_area(); std::cout <<'Area of the square = ' << sq_area< आउटपुट:
एक आयत की लंबाई और चौड़ाई दर्ज करें: 10 5
आयत का क्षेत्रफल = 50
त्रिकोण का आधार और ऊंचाई दर्ज करें: 4 8
त्रिभुज का क्षेत्रफल = 16
वर्ग के एक तरफ की लंबाई दर्ज करें: 5
वर्ग का क्षेत्रफल = २०
उपरोक्त उदाहरण क्लास शेप का एक उत्कृष्ट उदाहरण है। हमारे पास एक बेस क्लास शेप है और तीन वर्ग यानी आयत, त्रिभुज, और वर्ग इससे प्राप्त होते हैं।
हमारे पास आकृति वर्ग में डेटा पढ़ने की एक विधि है जबकि प्रत्येक व्युत्पन्न वर्ग के पास क्षेत्र की गणना करने की अपनी विधि है। मुख्य फ़ंक्शन में, हम प्रत्येक ऑब्जेक्ट के लिए डेटा पढ़ते हैं और फिर क्षेत्र की गणना करते हैं।
निष्कर्ष
जब अन्य प्रोग्रामिंग भाषाओं की तुलना में, C ++ भाषा सभी प्रकार की विरासत का समर्थन करती है। वास्तव में, हम कह सकते हैं कि C ++ को वंशानुक्रम के लिए बहुत अच्छा समर्थन है। हम C ++ का उपयोग करके वास्तविक समय की समस्याओं को अधिक प्रभावी ढंग से मॉडल कर सकते हैं।
इस ट्यूटोरियल में, हमने C ++ द्वारा समर्थित सभी प्रकार की विरासत देखी है।
यह भी पढ़ें = >> जावा में इनहेरिटेंस के प्रकार
हमारे आगामी ट्यूटोरियल में, हम OOP की बहुरूपता विशेषता के बारे में अधिक जानेंगे।
=> पूर्ण C ++ मुफ़्त प्रशिक्षण श्रृंखला यहां देखें।
अनुशंसित पाठ
- C ++ में वंशानुक्रम
- C ++ डेटा प्रकार
- सॉफ्टवेयर परियोजनाओं में जोखिम के प्रकार
- पायथन डेटा प्रकार
- सर्वश्रेष्ठ मुफ्त सी # ट्यूटोरियल श्रृंखला: शुरुआती के लिए अंतिम सी # गाइड
- यूनिक्स शैल लूप प्रकार: लूप के लिए, जबकि लूप के लिए, यूनिक्स में लूप तक
- मॉकिटो द्वारा प्रदान किए गए विभिन्न प्रकार के मिलान
- सॉफ्टवेयर त्रुटियों के 7 प्रकार जो हर परीक्षक को पता होना चाहिए