Polymorphism in C++ using Pointer

Polymorphism in C++: इसी प्रकार के Decoupling Effect को हम तब भी प्राप्त कर सकते हैं, जब हम Object को किसी Function Argument के रूप में By Pointer या By Address Pass करते हैं। इसी उदाहरण को हम निम्नानुसार Pointers के आधार पर भी Convert कर सकते हैं:

	// tests virtual functions and passing objects by pointer
	#include <iostream.h>
	#include <conio.h>

	class Base
	{
		public:
			virtual void speak()
			{ cout << “\nBase speaks"; }
	};

	class DerivedClass1 : public Base
	{
		public:
			void speak()
			{ cout << “\nDerivedClass1 speaks"; }
	};

	class DerivedClass2 : public Base
	{
		public:
			void speak()
			{ cout << “\nDerivedClass2 speaks"; }
	};

	//Main Program 
	void main()
	{
		void func(Base*);     	// prototype (note reference argument)
		DerivedClass1 d1;       // create derived class object d1
		DerivedClass2 d2;       // create derived class object d2

		func(&d1);            	// pass address of d1 to func()
		func(&d2);            	// pass address of d2 to func()
	}

	UDF
	void func(Base* ptr)
	{
		ptr->speak();
	}

इस उदाहरण की Classes पिछले उदाहरण के समान ही हैं। अन्तर केवल main() Function में है। इस main() Function से Objects func() Function में By Reference के स्थान पर By Pointer Pass किए गए हैं और speak() Member Function को Access करने के लिए -> Operator का प्रयोग किया गया है। यदि हम हमारे इस Program का Output देखे तो वह निम्नानुसार प्राप्त होता है:

DerivedClass1
DerivedClass2

सामान्‍यतया References का प्रयोग Arguments के रूप में तब किया जाता है जब Objects को Definition द्वारा Create किया जाता है। इस स्थिति में हमें Object का नाम पता होता है। लेकिन जब Objects को new Operator द्वारा Create किया जाता है और हमारे पास Object का केवल Pointer होता है, नाम नहीं] तब हम Object को Function मे By Address Pass करते हैं या Object का Pointer Function में Pass करते हैं।

References Pointers की तुलना में अधिक सुरिक्षत होते हैं, क्योंकि Pointers जिन Objects को Point करते हैं, उनके Data को Pointer द्वारा Change किया जा सकता है, लेकिन References केवल एक ही बार Initialize होते हैं और उनके Data को Change नहीं किया जा सकता है।

चलिए, हम एक बडा उदाहरण देखते हैं जो ज्यादा अच्छी तरह से समझा सकता है कि Polymorphism किस प्रकार से हमारे Code को किसी Specific Class से Independent बना सकता है। हमने इसी अध्‍याय में जो person, student व teacher का उदाहरण लिया था, उसी उदाहरण के Class-User Part को Rewrite कर रहे हैं।

हमारा उद्देश्‍य ये है कि End User को Program पर अधिक से अधिक नियं=ण प्रदान किया जाए। ये Program Options की एक List Display करता है और User ज्यादा अच्छी तरह से इस Program से Interaction कर सकता है। इस Program में User जितने चाहे उतने persons को Add कर सकता है।

ये Extra Capability प्राप्त करने के लिए हमने Class User Part को कई Functions में विभाजित कर दिया है। User जो Option Select करता है उस Option की Key के आधार पर main() Function में एक switch Statement द्वारा Appropriate Function को Call किया जाता है। इस Program में getPerson() Function User से Person के Data Accept करता है और displayPerson() Function किसी person के Data को Display करता है। ये उदाहरण Program निम्नानुसार है:

// Passing Pointers to Objects that uses Virtual Functions
	#include <iostream.h>
	#include <process.h>        	// for exit()

	class person                		// person class
	{
		protected:
			char name[40];

		public:
			virtual void getData()
			{ cout << “   Enter name: ";  cin >> name; }

			virtual void putData()
			{ cout << “\nName = ” << name; }

			virtual void isOutstanding()
			{  }               	// note: empty function body
	};

	class student : public person       	// student class
	{
		private:
			float gpa;              // grade point average

		public:
			void getData()          // get student data from user
			{
				person::getData();
				cout << “   Enter student's GPA: "; 
				cin >> gpa;
			}

			void putData()
			{
				person::putData();
				cout << “   GPA = ” << gpa;
			}

			void isOutstanding()
			{
				if (gpa > 3.5)
				cout << “ (This person is outstanding)";
			}
	};

	class teacher : public person      	// teacher class
	{
		private:
			int numPubs;            // number of papers published

		public:
			void getData()          // get teacher data from user
			{
				person::getData();
				cout << “   Enter number of teacher's publications: "; 
				cin >> numPubs;
			}

			void putData()
			{
				person::putData();
				cout << “   Publications = ” << numPubs;
			}

			void isOutstanding()
			{
				if(numPubs > 100)
				cout << “ (This person is outstanding)";
			}
	};

	//Main Program
	void main(void)
	{
		person* persPtr[100];          	// list of pointers to persons
		int n = 0;                     	// number of persons on list
		char choice;
		int j;
		person* getPerson();           	// prototypes
		void displayPerson(person*);

		while(1)                       	// cycle until exit
		{
				cout<< endl
						<< “'a' to add new person” << endl
						<< “'d' to display all persons” << endl
						<< “'x' to exit program” << endl
						<< “Enter selection: "; 
				cin>> choice;

			switch(choice)
			{
				case 'a':
					persPtr[n++] = getPerson();
					break;

				case 'd':
					for(j=0; j<n; j++)
					displayPerson( persPtr[j] );
					break;

				case 'x':
					for(j=0; j<n; j++)
					delete persPtr[j];   	// delete all person objects
					exit(0);
					break;

				default:
					cout << “\nNo such selection";
			}  // end switch
		}  // end while
	} // end main()

	//UDF
	person* getPerson()                	// function returns a person
	{
		person* tp;                     // pointer to person
		char choice;
		cout << “Enter person, student or teacher (p/s/t): "; 
		cin >> choice;

		if(choice=='s')                 // put new student
		tp = new student;            	//    in array

		else if(choice=='t')            // put new teacher
		tp = new teacher;            	//    in array

		else                            // put new person
		tp = new person;             	//    in array

		tp->getData();                  // get data for person
		return tp;                      // return pointer to person
	}  // end getPerson()'

	//UDF
	void displayPerson(person* pp)     	// function displays a person
	{
		pp->putData();                  // display data, and
		pp->isOutstanding();            // say if outstanding
	}
  

// Output
'a' to add new person
'd' to display all persons
'x' to exit program
Enter selection: a

Enter person, student or teacher (p/s/t): p
   Enter name: ManMohan

'a' to add new person
'd' to display all persons
'x' to exit program
Enter selection: a

Enter person, student or teacher (p/s/t): t
   Enter name: BalKishan
   Enter number of teacher's publications: 200

'a' to add new person
'd' to display all persons
'x' to exit program
Enter selection: a

Enter person, student or teacher (p/s/t): t
   Enter name: Nandlal
   Enter number of teacher's publications: 10

'a' to add new person
'd' to display all persons
'x' to exit program
Enter selection: a

Enter person, student or teacher (p/s/t): s
   Enter name: Madhav
   Enter student's GPA: 3

'a' to add new person
'd' to display all persons
'x' to exit program
Enter selection: a

Enter person, student or teacher (p/s/t): s
   Enter name: Gopal
   Enter student's GPA: 6

'a' to add new person
'd' to display all persons
'x' to exit program
Enter selection: d

Name = ManMohan
Name = BalKishan   Publications = 200 (This person is outstanding)
Name = Nandlal   Publications = 10
Name = Madhav   GPA = 3
Name = Gopal   GPA = 6 (This person is outstanding)

'a' to add new person
'd' to display all persons
'x' to exit program
Enter selection: x

User जितने चाहे उतने Persons को Database में Add कर सकता है और Display कर सकता है, जब तक कि Array persPtr की Limit पूरी ना हो जाए। जब User x Select करता है, तब Program Terminate हो जाता है।

ध्‍यान दें कि main() Function व displayPerson() Function में person Class के अलावा किसी Class का प्रयोग नहीं किया गया है। displayPerson() Function Argument के रूप में person Class के एक Pointer को लेता है और getPerson() Function एक Pointer to Function Return करता है।

User Code में केवल getPerson() Function में ही student व teacher Objects को Explicitly Use किया गया है, जहां User द्वारा Request किए गए प्रकार के Object को new Operator द्वारा Create किया जाता है।

User Code का किसी Specific Class से ये Isolation इन Functions को अजीब तरीके से Class Hierarchy को Change करने से रोक देता है। हालांकि Class Creator ने एक नए Derived Class को Program में Derived करके Classes को एक नया Modification प्रदान किया है। जैसे

class administrator : public person
{  };

 और

class football_coach : public person
{  };

इन लोगों की जानकारी को Maintain करने के लिए हमें main() Function या displayPerson() Function में किसी प्रकार का परिवर्तन करने की जरूरत नहीं है। हमें केवल getPerson() Function में ही थोडा सा Modification करना होगा। (Polymorphism in C++: CPlusPlus )

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