विषयों में गहराई से जाने से पहले आइए सभी संबंधित शर्तों को दोहराते हैं।
एक कॉपी कंस्ट्रक्टर एक विशेष प्रकार का कंस्ट्रक्टर है जिसका उपयोग एक ऑब्जेक्ट बनाने के लिए किया जाता है जो पास किए गए ऑब्जेक्ट की सटीक प्रति होती है।
एक वर्चुअल फ़ंक्शन एक मेंबर फ़ंक्शन है जिसे पैरेंट क्लास में घोषित किया जाता है और चाइल्ड क्लास में पुनर्परिभाषित (ओवरराइड) किया जाता है जो पैरेंट क्लास को विरासत में लेती है।
वर्चुअल कॉपी कंस्ट्रक्टर के उपयोग से, प्रोग्रामर ऑब्जेक्ट के सटीक डेटा प्रकार को जाने बिना एक ऑब्जेक्ट बनाने में सक्षम होगा।
C++ प्रोग्रामिंग भाषा में, कॉपी कंस्ट्रक्टर का उपयोग किसी अन्य से कॉपी किए गए ऑब्जेक्ट को बनाने के लिए किया जाता है। लेकिन यदि आप चाहते हैं कि प्रोग्राम रनटाइम पर बनाए गए ऑब्जेक्ट के प्रकार के बारे में निर्णय ले यानी ऑब्जेक्ट प्रकार रनटाइम पर परिभाषित हो, कंपाइल-टाइम पर नहीं और उपयोगकर्ता द्वारा किसी निश्चित स्थिति के लिए प्रदान किए गए कुछ इनपुट पर आधारित हो। इस स्थिति में, हमें कुछ विशेष शक्तियों वाले कॉपी कंस्ट्रक्टर की आवश्यकता होती है जो यह काम कर सके। इसलिए ऐसा करने के लिए वर्चुअल कॉपी कंस्ट्रक्टर घोषित किया जाता है जो रियल-टाइम में ऑब्जेक्ट्स की क्लोनिंग प्रदान करता है।
आइए एक उदाहरण लेते हैं, मान लीजिए हमारे पास एक आकृति है जिसका क्षेत्रफल प्रोग्राम का उपयोग करके ज्ञात किया जाना है। लेकिन ऑब्जेक्ट का प्रकार रनटाइम पर परिभाषित होता है कि यह वर्ग, आयत या वृत्त हो सकता है। तो हम एक वर्चुअल कॉपी कंस्ट्रक्टर का उपयोग करेंगे जो उपयोगकर्ता द्वारा इनपुट किए गए प्रकार के आधार पर ऑब्जेक्ट्स को कॉपी करेगा।
वर्चुअल कंस्ट्रक्टर्स को ठीक से काम करने के लिए बेस क्लास पर दो मेथड्स परिभाषित किए गए हैं। वे हैं:
clone() create()
कॉपी कंस्ट्रक्टर वर्चुअल 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 << "वर्ग बनाया गया" << endl; } square(const square& rhs) { } ~square() { } void ChangeAttributes(){ int a; cout<<"वर्ग की भुजा"; cin>>a; cout<<"वर्ग का क्षेत्रफल है "<<a*a; } figure *Clone(){ return new square(*this); } }; class circle : public figure{ public: circle(){ cout << "वृत्त बनाया गया" << endl; } circle(const circle& rhs) { } ~circle() { } void ChangeAttributes(){ int r; cout << "वृत्त की त्रिज्या दर्ज करें "; cin>>r; cout<<"वृत्त का क्षेत्रफल है "<<((3.14)*r*r); } figure *Clone(){ return new circle(*this); } }; class rectangle : public figure{ public: rectangle(){ cout << "आयत बनाया गया" << endl; } rectangle(const rectangle& rhs) { } ~rectangle() { } void ChangeAttributes(){ int a, b; cout<<"आयत के आयाम "; cin>>a>>b; cout<<"आयत का क्षेत्रफल है "<<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 << "आईडी दर्ज करें (1, 2 या 3): "; cin >> input; while( (input != 1) && (input != 2) && (input != 3) ){ cout << "आईडी दर्ज करें (केवल 1, 2 या 3): "; 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; } आउटपुट
आईडी दर्ज करें (1, 2 या 3): 2 वृत्त बनाया गया वृत्त की त्रिज्या दर्ज करें 3 वृत्त का क्षेत्रफल है 28.26