c++ - with - वर्चुअल फ़ंक्शन और शुद्ध आभासी फ़ंक्शन के बीच अंतर




virtual function in c++ in hindi (3)

आप वास्तव में सी ++ में शुद्ध आभासी कार्यों के कार्यान्वयन प्रदान कर सकते हैं। एकमात्र अंतर यह है कि क्लास को तुरंत चालू करने से पहले सभी शुद्ध आभासी कार्यों को व्युत्पन्न कक्षाओं द्वारा कार्यान्वित किया जाना चाहिए।

संभावित डुप्लिकेट:
सी ++ आभासी / शुद्ध आभासी समझाया

शुद्ध वर्चुअल फ़ंक्शन और वर्चुअल फ़ंक्शन के बीच क्या अंतर है?

मुझे पता है "शुद्ध वर्चुअल फ़ंक्शन कोई वर्चुअल फ़ंक्शन नहीं है", लेकिन इसका क्या अर्थ है और वास्तव में नीचे दी गई रेखा से क्या किया जाता है:

virtual void virtualfunctioname() = 0

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

 Derived d;
 Base& rb = d;
 // if Base::f() is virtual and Derived overrides it, Derived::f() will be called
 rb.f();  

एक शुद्ध वर्चुअल फ़ंक्शन एक आभासी फ़ंक्शन है जिसका घोषणा =0 में समाप्त होती है:

class Base {
  // ...
  virtual void f() = 0;
  // ...

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

सी ++ का एक दिलचस्प 'फीचर' यह है कि एक वर्ग शुद्ध वर्चुअल फ़ंक्शन को परिभाषित कर सकता है जिसमें कार्यान्वयन होता है। ( यह क्या अच्छा है बहस योग्य है ।)

ध्यान दें कि सी ++ 11 ने delete और default कीवर्ड के लिए एक नया उपयोग लाया जो शुद्ध आभासी कार्यों के वाक्यविन्यास के समान दिखता है:

my_class(my_class const &) = delete;
my_class& operator=(const my_class&) = default;

delete और default इस उपयोग पर अधिक जानकारी के लिए यह प्रश्न और यह देखें।


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





pure-virtual