2011-03-30 13 views
37

शुद्ध वर्चुअल फ़ंक्शंस (जब हम = 0 सेट करते हैं) में फ़ंक्शन बॉडी भी हो सकती है।सी ++ शुद्ध वर्चुअल फ़ंक्शन में शरीर

शुद्ध आभासी कार्यों के लिए फ़ंक्शन बॉडी प्रदान करने के लिए क्या उपयोग किया जाता है, अगर उन्हें बिल्कुल नहीं कहा जा रहा है?

+0

[कार्यान्वयन के साथ शुद्ध आभासी समारोह] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2089083/pure-virtual-function-with-implementation) –

+0

खेद है! मैं इस मंच पर शर्तों के लिए कुछ नया हूँ। मैंने जो जवाब सही महसूस किया है, उसके जवाब स्वीकार कर लिए हैं। सुझावों के लिए धन्यवाद। – Vijay

+0

[कार्यान्वयन के साथ शुद्ध वर्चुअल फ़ंक्शन] का संभावित डुप्लिकेट (https://stackoverflow.com/questions/2089083/pure-virtual-function-with-implementation) – finnw

उत्तर

59

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

सी ++ भाषा में वर्चुअल फ़ंक्शन पर स्थैतिक कॉल तब किया जाता है जब कॉल में फ़ंक्शन का एक योग्य नाम उपयोग किया जाता है, यानी जब कॉल में निर्दिष्ट फ़ंक्शन नाम <class name>::<function name> रूप होता है।

उदाहरण

लिए
struct S { 
    virtual void foo() = 0; 
}; 

void S::foo() { 
    // body for the pure virtual function `S::foo` 
} 

struct D : S { 
    void foo() { 
    S::foo(); // static call to `S::foo` from derived class 
    } 
}; 

int main() { 
    D d; 
    d.S::foo(); // another static call to `S::foo` 
} 
4

अधिकांश शुद्ध वर्चुअल फ़ंक्शंस के लिए, आप सही होंगे।

  • "शुद्ध आभासी" व्युत्पन्न वर्ग की आवश्यकता होती है करने के लिए अपने नाशक लागू करने के लिए है: हालांकि, एक शुद्ध आभासी नाशक के लिए, यह वास्तव में महत्वपूर्ण एक इसी नाशक कार्यान्वयन को परिभाषित करने के लिए है।
  • आपका बेस क्लास विनाशक कार्यान्वयन इतना है कि व्युत्पन्न वर्ग विनाशक सफलतापूर्वक "चेन अप" कर सकते हैं।
+8

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

19

"प्रभावी सी ++" मेयर्स उल्लेख करने के लिए एक शुद्ध आभासी समारोह के लिए एक कारण एक शरीर है: व्युत्पन्न वर्गों है कि इस शुद्ध आभासी समारोह लागू इस कार्यान्वयन उनके कोड में smwhere कह सकते हैं। यदि के कोड का हिस्सा 0 अलग-अलग व्युत्पन्न वर्ग समान है तो इसे पदानुक्रम में ऊपर ले जाने के लिए समझ में आता है, भले ही फ़ंक्शन शुद्ध वर्चुअल होना चाहिए।

here देखें।

संबंधित मुद्दे