Multiple Inheritance in C++

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)

CPP Programming Language in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook C++ Programming Language in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C++ Programming Language in Hindi | Page: 666 | Format: PDF

BUY NOW GET DEMO REVIEWS