Multiple Inheritance in C++: जब किसी Class को कई अन्य Base Classes से Derive किया जाता है, तब इस प्रकार की Inheritance को Multiple Inheritance कहते हैं। उदाहरण के लिए:
class Base1 { }; class Base2 { }; class DerivedClass : public Base1, public Base2 { };
हम इस Code Segment में देख सकते हैं कि DerivedClass दो Base Classes Base1 व Base2 से Derive हो रही है। यानी इस Class में Base1 Class व Base2 Class दोनों Classes के Features व Member Functions उपलब्ध हैं और इस Derived Class द्वारा हम इन दोनों Base Classes के Features व Member Functions का उपयोग कर सकते हैं।
Derive Class जिन-जिन Base Classes से Derive होती है, उन सभी Base Classes को कोमा द्वारा अलग किया जाता है और हर Base Class का स्वयं का Access Specifier होता है। इसे समझने के लिए हम एक Practical उदाहरण देखते हैं।
हम एक employee Class Hierarchy को Develop कर रहे हैं और हम इस Class में laborers को छोडकर किसी विशेष प्रकार के Employee की Educational Qualifications को भी Include करना चाहते हैं।
मानलो कि किसी Company ने एक Student Class को Develop किया है जिसमें किसी Student के विभिन्न Educational Data को Manage व Display किया जा सकता है। इन दोनों Classes को Multiple Inheritance द्वारा Combine किया जा सकता है। वे Classes जिन्हें Educational Data को Manage करने की जरूरत है, उन्हें Student व Employee दोनों Classes से Inherit किया जा सकता है। इस प्रकार की Derived Class को हम निम्नानुसार Code Segment द्वारा Represent कर सकते हैं:
class student { ... }; class employee { ... }; class manager : public employee, public student { ... }; class scientist : public employee, public student { ... }; class laborer : public employee { ... };
हम देख सकते हैं कि Manager व Scientist Classes को Employee व Student दोनों Class से Inherit करना है, लेकिन labor Class को केवल Employee Class से ही Inherit करना है। इस Code Segment के आधार पर हम Program को निम्नानुसार Design कर सकते हैं:
// multiple inheritance with employees and students #include <iostream.h> #include <conio.h> const int LEN = 80; class student // educational background { private: char school[LEN]; // name of school or university char degree[LEN]; // highest degree earned public: void getedu() { cout << " Enter name of school or university: "; cin >> school; cout << " Enter highest degree earned \n"; cout << " (Highschool, Bachelor's, Master's, PhD): "; cin >> degree; } void putedu() { cout << "\n School or university = " << school; cout << "\n Highest degree earned = " << degree; } }; class employee { private: char name[LEN]; // employee name unsigned long number; // employee number public: void getdata() { cout << "\n Enter last name: "; cin >> name; cout << " Enter number: "; cin >> number; } void putdata() { cout << "\n Name = " << name; cout << "\n Number = " << number; } }; class manager : public employee, public student // management { private: char title[LEN]; // "vice-president" etc. double dues; // golf club dues public: void getdata() { employee::getdata(); cout << " Enter title: "; cin >> title; cout << " Enter golf club dues: "; cin >> dues; student::getedu(); } void putdata() { employee::putdata(); cout << "\n Title = " << title; cout << "\n Golf club dues = " << dues; student::putedu(); } }; class scientist : public employee, public student // scientist { private: int pubs; // number of publications public: void getdata() { employee::getdata(); cout << " Enter number of pubs: "; cin >> pubs; student::getedu(); } void putdata() { employee::putdata(); cout << "\n Number of publications = " << pubs; student::putedu(); } }; class laborer : public employee // laborer { }; void main() { manager m1; scientist s1, s2; laborer l1; cout << endl; cout << "\nEnter data for manager 1"; // get data for m1.getdata(); // several employees cout << "\nEnter data for scientist 1"; s1.getdata(); cout << "\nEnter data for scientist 2"; s2.getdata(); cout << "\nEnter data for laborer 1"; l1.getdata(); cout << "\nData on manager 1"; // display data for m1.putdata(); // several employees cout << "\nData on scientist 1"; s1.putdata(); cout << "\nData on scientist 2"; s2.putdata(); cout << "\nData on laborer 1"; l1.putdata(); }
ध्यान दें कि यदि दोनों Classes में समान नाम के Functions हों, तो Derived Class में Scope Resolution Operator का प्रयोग करके Compiler को ये बताना चाहिए कि Derived Class किस Class के Member Function को Access करना चाहता है। उदाहरण के लिए employee::getdata() या student::getdata(), इस Program से User निम्नानुसार Interaction करता है:
Enter data for manager 1 Enter last name: Madhav Enter number: 121230 Enter title: Presidence Enter golf club dues: 10 Enter name of school or university: MDS Enter highest degree earned (Highschool, Bachelor's, Master's, PhD): PhD Enter data for scientist 1 Enter last name: BalKishan Enter number: 545403 Enter number of pubs: 100 Enter name of school or university: MKU Enter highest degree earned (Highschool, Bachelor's, Master's, PhD): Master Enter data for scientist 2 Enter last name: Lal Enter number: 21211212 Enter number of pubs: 10 Enter name of school or university: MKU Enter highest degree earned (Highschool, Bachelor's, Master's, PhD): Bachelor Enter data for laborer 1 Enter last name: Kishan Enter number: 454530 Data on manager 1 Name = Madhav Number = 121230 Title = Presidence Golf club dues = 10 School or university = MDS Highest degree earned = PhD Data on scientist 1 Name = BalKishan Number = 545403 Number of publications = 100 School or university = MKU Highest degree earned = Master Data on scientist 2 Name = Lal Number = 21211212 Number of publications = 10 School or university = MKU Highest degree earned = Bachelor Data on laborer 1 Name = Kishan Number = 454530
कभी भी एक ही Base Class से Inherited Derive Class को दो बार नहीं लिखना चाहिए। यानी निम्न तरीके का Code Declaration गलत है:
class Base1 { }; class DerivedClass : public Base1, public Base1 { };
क्योंकि इसमें Base1 को कोमा का प्रयोग करके दो बार लिखा गया है। इस Program में Multiple Inheritance उसी प्रकार से काम करता है जिस प्रकार से हम उम्मीद करते हैं। लेकिन जब Classes अधिक होती हैं और हमें विशेष प्रकार से Multiple Inheritance की आवश्यकता होती है, तब कई बार हमें Complication का सामना करना पडता है। इस प्रकार की समस्या अक्सर निम्न स्थिति के Inheritance वाले Program में होती है:
class Gparent { }; class Mother : public Gparent { }; class Father : public Gparent { }; class Child : public Mother, public Father { };
इस Code Segment में हम देखते हैं कि Mother व Father दोनों ही Gparent Class से Inherited हैं और Child Class Mother व Father दोनों से Inherited है। ध्यान दें कि Inheritance से Create होने वाले हर Object में Base Class का एक Subobject होता है। इसलिए Mother Object व Father Object इन दोनों में Gparent का एक Subobject होगा और Child Object में Mother व Father का Subobject होगा। इसलिए Child Object में Gparent के भी दो Subobject होंगे, जिनमें से एक Mother द्वारा Inherit किया गया है व दूसरा Father द्वारा। ये एक अजीब प्रकार की स्थिति है। जहां केवल एक Subobject होना चाहिए, वहां दो Subobject हैं। मानलो कि Gparent में निम्नानुसार Data Items हैं:
class Gparent { protected: int gdata; };
और हम इस Item को Child Class से निम्न Statement द्वारा Access करना चाहते हैं:
class Child : public Mother, public Father { public: void Cfunc() { int temp = gdata; // error: ambiguous } };
इस स्थिति में Compiler हमें एक Error Message देता है कि gdata का Reference स्पष्ट या Clear नहीं है। Compiler को पता नहीं चलता है कि हम किस gdata को Access करना चाहते हैं: उस Gparent Subobject के gdata को जो कि Mother के Subobject में है या उस Gparent Subobject के gdata को जो कि Father Subobject में है। इस समस्या से बचने के लिए हम “C++” के virtual Keyword का प्रयोग उस समय कर सकते हैं जब हम Gparent से Mother व Father को Derive कर रहे होते हैं। यानी
class Gparent { }; class Mother : virtual public Gparent { }; class Father : virtual public Gparent { }; class Child : public Mother, public Father { };
ये Keyword Compiler को बताता है कि वह Base Class से केवल एक ही Subobject को Derived Class में Inherit करे। इससे इस अस्पष्टता या Ambiguity की समस्या का समाधान हो जाता है। लेकिन एक और अधिक जटिल समस्या सामने आ जाती है, जिसे यहां समझाना काफी मुश्किल है। इसलिए सामान्य रूप से यदि विभिन्न प्रकार की परेशानियों से बचना हो और “C++” पर अच्छी पकड ना हो तो Multiple Inheritance को Avoid करना चाहिए।
Multiple Inheritance के स्थान पर सामान्यतया Use किया जाने वाला Substitution Composition है। हम पिछले Program को Multiple Inheritance के स्थान पर Composition का प्रयोग करके भी Create कर सकते हैं।
इस प्रक्रिया में हमें Derived Employee Class में Student Object को Data Member की तरह Include करना होता है। इसमें Student व Employee की Class Unhanded रहती हैं लेकिन Manager व Scientist Class Student Object को Include या Compose कर लेते हैं। हम इस पूरे Program को वापस Develop नहीं कर रहे हैं। लेकिन Manager Class को इस Concept के आधार पर निम्नानुसार Modify किया जा सकता है:
class manager : public employee // management { private: char title[LEN]; // "vice-president" etc. double dues; // golf club dues student stu; // NOTE: student object public: void getdata() { employee::getdata(); cout << " Enter title: "; cin >> title; cout << " Enter golf club dues: "; cin >> dues; stu.getedu(); // send message to student object } void putdata() { employee::putdata(); cout << "\n Title = " << title; cout << "\n Golf club dues = " << dues; stu.putedu(); // send message to student object } };
इस Modified Class में Student Object stu को Manager Class में Composition का प्रयोग करते हुए Data Member की तरह Involve किया गया है। Scientist Class को भी इसी तरह से Modify किया जा सकता है। Program का main() function Unchanged रखा जा सकता है। User का Program से Interaction बिल्कुल पुराने Program की तरह ही रहता है। Student Class को Composition द्वारा Manager व Scientist Class में Compose कर लेना सैद्धांतिक रूप से भी सही है। क्योंकि हालांकि Manager व Scientist Employee प्रकार के (Kind Of) हैं लेकिन ये वास्तव में Student प्रकार के (Kind Of) नहीं हैं। इसलिए इस तरह से Composition किया जा सकता है। (Multiple Inheritance in C++ – StackOverflow)
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook C++ Programming Language in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
C++ Programming Language in Hindi | Page: 666 | Format: PDF