विषयों की गहराई में जाने से पहले, आइए सभी संबंधित शब्दों पर ध्यान दें।
एक कॉपी कंस्ट्रक्टर एक विशेष प्रकार का कंस्ट्रक्टर है जिसका उपयोग किसी ऑब्जेक्ट को बनाने के लिए किया जाता है जो पास की गई वस्तु की एक सटीक प्रति है।
एक वर्चुअल फ़ंक्शन एक सदस्य फ़ंक्शन है जिसे पैरेंट क्लास में घोषित किया जाता है और एक चाइल्ड क्लास में फिर से परिभाषित (ओवरराइड) किया जाता है जो पैरेंट क्लास को इनहेरिट करता है।
वर्चुअल कॉपी कंस्ट्रक्टर के उपयोग से, प्रोग्रामर ऑब्जेक्ट के सटीक डेटा प्रकार को जाने बिना ऑब्जेक्ट बनाने में सक्षम होगा।
C++ प्रोग्रामिंग लैंग्वेज में कॉपी कंस्ट्रक्टर का इस्तेमाल दूसरे से कॉपी किए गए ऑब्जेक्ट को बनाने के लिए किया जाता है। लेकिन यदि आप चाहते हैं कि प्रोग्राम रनटाइम पर बनाए गए ऑब्जेक्ट के प्रकार के बारे में निर्णय करे यानी उस ऑब्जेक्ट प्रकार को रनटाइम पर परिभाषित किया गया है, न कि संकलन-समय पर और उपयोगकर्ता द्वारा एक निश्चित स्थिति के लिए प्रदान किए गए कुछ इनपुट पर आधारित है। इस स्थिति में, हमें इस काम को करने के लिए कुछ विशेष शक्तियों के साथ एक कॉपी कंस्ट्रक्टर की आवश्यकता होती है। तो ऐसा करने के लिए यह वर्चुअल कॉपी कंस्ट्रक्टर घोषित किया जाता है जो वास्तविक समय में वस्तुओं की क्लोनिंग प्रदान करता है।
आइए एक उदाहरण लेते हैं, मान लीजिए कि हमारे पास एक आकृति है जो प्रोग्राम का उपयोग करके पता लगाया जाना है। लेकिन किसी वस्तु के प्रकार को वास्तविक समय के रूप में परिभाषित किया जाता है कि यह एक वर्ग आयत या एक वृत्त हो सकता है। इसलिए हम एक वर्चुअल कॉपी कंस्ट्रक्टर का उपयोग करेंगे जो उपयोगकर्ता द्वारा इनपुट किए गए प्रकार के आधार पर ऑब्जेक्ट को कॉपी करेगा।
वर्चुअल कंस्ट्रक्टर्स के ठीक से काम करने के लिए बेस क्लास पर परिभाषित दो तरीके हैं। वे हैं -
clone() create()
कॉपी कंस्ट्रक्टर वर्चुअल क्लोन मेथड का इस्तेमाल करता है जबकि वर्चुअल क्रिएट मेथड का इस्तेमाल डिफॉल्ट कंस्ट्रक्टर्स द्वारा वर्चुअल कंस्ट्रक्टर बनाने के लिए किया जाता है।
उदाहरण
#include <iostream> using namespace std; class figure{ public: figure() { } virtual ~figure() { } virtual void ChangeAttributes() = 0; static figure *Create(int id); virtual figure *Clone() = 0; }; class square : public figure{ public: square(){ cout << "square created" << endl; } square(const square& rhs) { } ~square() { } void ChangeAttributes(){ int a; cout<<"The side of square"; cin>>a; cout<<"Area of square is "<<a*a; } figure *Clone(){ return new square(*this); } }; class circle : public figure{ public: circle(){ cout << "circle created" << endl; } circle(const circle& rhs) { } ~circle() { } void ChangeAttributes(){ int r; cout << "enter the radius of the circle "; cin>>r; cout<<"the area of circle is "<<((3.14)*r*r); } figure *Clone(){ return new circle(*this); } }; class rectangle : public figure{ public: rectangle(){ cout << "rectangle created" << endl; } rectangle(const rectangle& rhs) { } ~rectangle() { } void ChangeAttributes(){ int a ,b; cout<<"The dimensions of rectangle "; cin>>a>>b; cout<<"Area of rectangle is "<<a*b; } figure*Clone(){ return new rectangle(*this); } }; figure *figure::Create(int id){ if( id == 1 ){ return new square; } else if( id == 2 ){ return new circle; } else{ return new rectangle; } } class User{ public: User() : figures(0){ int input; cout << "Enter ID (1, 2 or 3): "; cin >> input; while( (input != 1) && (input != 2) && (input != 3) ){ cout << "Enter ID (1, 2 or 3 only): "; cin >> input; } figures = figure::Create(input); } ~User(){ if( figures ){ delete figures; figures = 0; } } void Action(){ figure *newfigure = figures->Clone(); newfigure->ChangeAttributes(); delete newfigure; } private: figure *figures; }; int main(){ User *user = new User(); user->Action(); delete user; }
आउटपुट
Enter ID (1, 2 or 3): 2 circle created enter the radius of the circle R 3 the area of circle is 28.26