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 )
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook C++ Programming Language in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
C++ Programming Language in Hindi | Page: 666 | Format: PDF