C ++ में वर्चुअल फंक्शन कैसे लागू करें?



यह आलेख आपको अभी तक एक अन्य प्रोग्रामिंग अवधारणा से परिचित कराएगा जो C ++ में वर्चुअल फ़ंक्शन है। अवधारणा को प्रदर्शन द्वारा समर्थित किया जाएगा।

में एक आभासी समारोह सी ++ बेस क्लास के भीतर एक सदस्य फ़ंक्शन है जिसे हम एक व्युत्पन्न वर्ग में फिर से परिभाषित करते हैं। यह लेख आपको अवधारणा को विस्तार से जानने में मदद करेगा। इस आलेख में निम्नलिखित बिंदुओं को शामिल किया जाएगा,

तो चलिए C ++ में वर्चुअल फंक्शन पर इस लेख के साथ शुरुआत करते हैं





वर्चुअल फंक्शन क्या है?

एक आभासी फ़ंक्शन बेस क्लास के भीतर एक सदस्य फ़ंक्शन है जिसे हम एक व्युत्पन्न वर्ग में फिर से परिभाषित करते हैं। यह वर्चुअल कीवर्ड का उपयोग करके घोषित किया गया है। जब वर्चुअल फंक्शन वाली क्लास विरासत में मिलती है, तो व्युत्पन्न क्लास अपनी जरूरतों के हिसाब से वर्चुअल फंक्शन को फिर से परिभाषित करती है।

C ++ में वर्चुअल फ़ंक्शन पर इस लेख के साथ आगे बढ़ना



C ++ में वर्चुअल फ़ंक्शन के नियम:

  • उन्हें हमेशा एक बेस क्लास में परिभाषित किया जाता है और व्युत्पन्न वर्ग में ओवरराइड किया जाता है लेकिन व्युत्पन्न वर्ग में ओवरराइड करना अनिवार्य नहीं है।
  • वर्चुअल फ़ंक्शंस को वर्ग के सार्वजनिक अनुभाग में घोषित किया जाना चाहिए।
  • वे स्थिर नहीं हो सकते हैं या मित्र फ़ंक्शन भी किसी अन्य वर्ग का वर्चुअल फ़ंक्शन नहीं हो सकता है।
  • आभासी कार्यों को रन टाइम पॉलिमोर्फिज्म को प्राप्त करने के लिए पॉइंटर का उपयोग करके एक्सेस किया जाना चाहिए।

C ++ में वर्चुअल फ़ंक्शन पर इस लेख के साथ आगे बढ़ना।

बंधन क्या है?

फ़ंक्शंस के लिए बाइंडिंग का मतलब है कि जहां भी फ़ंक्शन कॉल होता है, कंपाइलर को यह जानने की आवश्यकता होती है कि इसे किस फ़ंक्शन की परिभाषा से मेल खाना चाहिए। यह प्रत्येक फ़ंक्शन घोषणा और लिए गए असाइनमेंट के हस्ताक्षर पर निर्भर करता है। साथ ही, कंपाइलर को यह जानना होगा कि फ़ंक्शन कॉल और सही परिभाषा चुनने के बीच यह मिलान कब होगा।

C ++ में वर्चुअल फ़ंक्शन पर इस लेख के साथ आगे बढ़ना



अर्ली बाइंडिंग

अर्ली बाइंडिंग एक ऐसी घटना है जिसमें विभिन्न फंक्शन कॉल्स का मिलान करने का निर्णय संकलन समय पर ही होता है और कंपाइलर सीधे लिंक को पते के साथ जोड़ देता है। इसे स्टेटिक बाइंडिंग या कम्पाइल-टाइम बाइंडिंग के रूप में भी जाना जाता है।

  • जैसा कि हम जानते हैं कि हम उच्च-स्तरीय भाषा में कोड लिखते हैं
  • तब कंपाइलर इसे निम्न-स्तरीय भाषा में परिवर्तित करता है जिसे कंप्यूटर समझ सकता है, ज्यादातर मशीन भाषा संकलन के समय
  • शुरुआती बाध्यकारी में, संकलक सीधे फ़ंक्शन कॉल निर्देश को फ़ंक्शन घोषणा निर्देश का पता प्रदान करता है
  • इस प्रकार जैसा कि नाम से पता चलता है कि कार्यक्रम के चलने से पहले बंधन बहुत पहले होता है।

उदाहरण

# नामस्थान std वर्ग के उपयोग से अलग करें जानवरों {सार्वजनिक: शून्य ध्वनि () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <ध्वनि () // जल्दी बाध्यकारी वापसी 0}

आउटपुट

आउटपुट- C ++ में वर्चुअल फंक्शन - एडुर्का

स्पष्टीकरण आयन
इस उदाहरण में, हमने अभिभावक वर्ग जानवरों के लिए एक सूचक बनाया। फिर एक = & c लिखकर, पॉइंटर ring a ’क्लास कैट्स के ऑब्जेक्ट c का जिक्र करने लगा।
a -> साउंड () - फंक्शन साउंड () को कॉल करने पर जो पॉइंटर 'a' द्वारा दोनों वर्गों में मौजूद होता है, पैरेंट क्लास के फंक्शन को कॉल किया जाता है, भले ही पॉइंटर क्लास के ऑब्जेक्ट की बात कर रहा हो ।

सी में सूचीबद्ध सूची कार्यक्रम

यह अर्ली बाइंडिंग के कारण है। हम जानते हैं कि 'ए' चाइल्ड क्लास की वस्तु का संदर्भ देने वाला मूल वर्ग का सूचक है। चूंकि कंपाइल-टाइम पर शुरुआती बाइंडिंग होती है, इसलिए जब कंपाइलर ने देखा कि 'a' पैरेंट क्लास का पॉइंटर है, तो उसने पैरंट क्लास के 'साउंड ()' फंक्शन के साथ कॉल को मैच किया बिना पॉइंटर को सर्च किए। का जिक्र कर रहा है।

C ++ में वर्चुअल फ़ंक्शन पर इस लेख के साथ आगे बढ़ना

देर से बांधना

देर से बाध्यकारी में, संकलक ऑब्जेक्ट को रनटाइम पर पहचानता है और फिर फ़ंक्शन कॉल को सही फ़ंक्शन के साथ मेल खाता है। इसे डायनामिक बाइंडिंग या रनटाइम बाइंडिंग के रूप में भी जाना जाता है।

आधार वर्ग में आभासी कीवर्ड का उपयोग करके उपरोक्त समस्या में देर से बाध्यकारी को हल किया जा सकता है। आइए देखें कि उपरोक्त उदाहरण का उपयोग करके यह कैसे होता है, लेकिन केवल आभासी कीवर्ड को जोड़ने से।

उदाहरण

डोनट चार्ट बनाम पाई चार्ट
# नामस्थान std क्लास एनिमल्स {पब्लिक: वर्चुअल वॉयड साउंड () {cout का उपयोग करके बाहर निकालें<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <ध्वनि () 0}

आउटपुट

स्पष्टीकरण
यहाँ बेस क्लास के फंक्शन साउंड () को आभासी बनाया गया है, इस प्रकार कंपाइलर अब इस फ़ंक्शन के लिए देर से बाइंडिंग करता है। अब, रन टाइम पर साउंड (फंक्शन) के फंक्शन कॉल को फंक्शन डेफिनेशन से मैच किया जाएगा। चूंकि कंपाइलर अब सूचक ‘a’ की पहचान व्युत्पन्न वर्ग बिल्लियों के ऑब्जेक्ट of c ’के रूप में करता है, इसलिए यह वर्ग बिल्लियों के ध्वनि () फ़ंक्शन को कॉल करेगा।

C ++ में वर्चुअल फ़ंक्शन पर इस लेख के साथ आगे बढ़ना

शुद्ध आभासी कार्य

C ++ में एक शुद्ध वर्चुअल फंक्शन एक वर्चुअल फंक्शन है, जिसके लिए हमारे पास कोई कार्यान्वयन नहीं है, हम केवल इसे घोषित करते हैं। घोषणा में 0 असाइन करके एक शुद्ध आभासी फ़ंक्शन घोषित किया गया है।

आभासी शून्य ध्वनि () = 0

यहाँ ध्वनि () एक शुद्ध आभासी फ़्यूज़न है।

C ++ में वर्चुअल फ़ंक्शन पर इस लेख के साथ आगे बढ़ना

सार वर्ग

एक सार वर्ग को एक या अधिक शुद्ध आभासी कार्यों के साथ एक वर्ग के रूप में परिभाषित किया गया है। जैसा कि शुद्ध आभासी फ़ंक्शन के ऊपर बताया गया है, एक आभासी सदस्य फ़ंक्शन है जिसे कोई कार्यान्वयन नहीं होने के रूप में चिह्नित किया गया है। यह किसी भी आधार वर्गों सहित, वर्ग में प्रदान की गई जानकारी के साथ संभव नहीं है। एक अमूर्त वर्ग को एक अमूर्त आधार वर्ग के रूप में भी जाना जाता है।

उदाहरण

# नाम स्थान std वर्ग कर्मचारी // सार आधार वर्ग {वर्चुअल int getSalary () = 0 // शुद्ध आभासी फ़ंक्शन} वर्ग Employee_1: सार्वजनिक कर्मचारी {int वेतन सार्वजनिक: Employee_1 (int s {वेतन = s) int getSalary () का उपयोग करके निकालें {return सैलरी}} वर्ग Employee_2: जनता कर्मचारी {int सैलरी public: Employee_2 (int t) {वेतन = t} int getSalary () {return सैलरी}} int main () {Employee_1 e1 (5000) Employee_2 e2 (3000) int a, ba = e1.getSalary () b = e2.getSalary () cout<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 } 

आउटपुट

स्पष्टीकरण
कर्मचारी में the getSalary () फ़ंक्शन एक शुद्ध आभासी फ़ंक्शन है। चूंकि कर्मचारी वर्ग में शुद्ध आभासी फ़ंक्शन होता है, इसलिए यह एक सार आधार वर्ग है।
चूंकि उपवर्गों में शुद्ध आभासी फ़ंक्शन को परिभाषित किया जाता है, इसलिए फ़ंक्शन al getSalary () 'को वर्ग कर्मचारी के दोनों उपवर्गों में परिभाषित किया गया है, जैसे कि Employee_1 और Employee_2 में।

C ++ में वर्चुअल फ़ंक्शन पर इस लेख के साथ आगे बढ़ना

वर्चुअल फ़ंक्शन के लिए उदाहरण

# नामस्थान std वर्ग आधार {public: void function_1 () {cout का उपयोग करके निकालें<< 'base class function 1n' } virtual void function_2() { cout << 'base class function 2n' } virtual void function_3() { cout << 'base class function 3n' } virtual void function_4() { cout << 'base class function 4n' } } class derived : public base { public: void function_1() { cout << 'derived class function 1n' } void function_2() { cout << 'derived class function 2n' } void function_4(int x) { cout function_2 () ptr-> function_3 () ptr-> function_4 ()}

आउटपुट

अंत में अंतिम और जावा में अंतिम रूप दें

स्पष्टीकरण
Function_1 () फ़ंक्शन कॉल के लिए, फ़ंक्शन का बेस क्लास संस्करण कहा जाता है, function_2 () व्युत्पन्न वर्ग में ओवरराइड किया जाता है इसलिए व्युत्पन्न वर्ग संस्करण कहा जाता है, फ़ंक्शन_3 () व्युत्पन्न वर्ग में ओवरराइड नहीं किया जाता है और वर्चुअल फ़ंक्शन है इसलिए बेस क्लास संस्करण कहा जाता है। इसी प्रकार function_4 () को ओवरराइड नहीं किया जाता है इसलिए बेस क्लास वर्जन कहा जाता है।

इस प्रकार हम इस लेख के अंत में 'C ++ में वर्चुअल फंक्शन' पर आए हैं। आप और अधिक जानने के लिए चाहते हैं, तो बाहर की जाँच करें Edureka, एक विश्वसनीय ऑनलाइन शिक्षण कंपनी है। एडुर्का के जावा जे 2 ईई और एसओए प्रशिक्षण और प्रमाणन पाठ्यक्रम आपको हाइबरनेट और स्प्रिंग जैसे विभिन्न जावा फ्रेमवर्क के साथ कोर और उन्नत जावा अवधारणाओं दोनों के लिए प्रशिक्षित करने के लिए डिज़ाइन किया गया है।

क्या आप हमसे कोई प्रश्न पूछना चाहते हैं? कृपया इस ब्लॉग के टिप्पणी अनुभाग में इसका उल्लेख करें और हम जल्द से जल्द आपके पास वापस आ जाएंगे।