एक समारोह है कि एक =0
में समाप्त होता है एक deleted function
कहा जाता है, यह उपयोगी होता है जब आप वस्तुओं है कि कुछ निर्माताओं (जैसे unique_ptr
जो एक नष्ट कर दिया प्रतिलिपि ctor है के रूप में) का उपयोग नहीं करना चाहती।
यदि virtual
फ़ंक्शन हटा दिया जाता है तो मानक मानक वर्ग बन जाता है। चूंकि ज्यादातर मामलों में कक्षा और वर्ग के फ़ंक्शन निकायों का प्रोटोटाइप अलग-अलग फ़ाइलों में होता है, इसका अर्थ यह है कि जब तक आप स्पष्ट रूप से प्रोटोटाइप में रूपरेखा नहीं देते हैं कि आप हटाए गए वर्चुअल फ़ंक्शन को ओवरराइड कर रहे हैं तो आप हटाए गए वर्चुअल फ़ंक्शन को ओवरराइड नहीं कर रहे हैं। कंपाइलर को केवल यह अनुमान लगाने की आवश्यकता नहीं है कि एक बार पूरी तरह से अलग फ़ाइल में कार्यान्वयन को देखने के बाद आप उस समारोह को वहां रखना चाहते थे।
याद रखें कि प्रोटोटाइप/कार्यान्वयन विचार कोड लिखने का एकमात्र तरीका नहीं है, आप कक्षा में कार्यान्वयन को सही भी डाल सकते हैं (यदि कोड पर्याप्त छोटा हो और आप फ़ंक्शन को इनलाइन करना चाहते हैं तो किया जा सकता है।) और ऐसा करने के लिए आपको फिर से हटाने की आवश्यकता है, हटाए गए वर्चुअल फ़ंक्शन को स्पष्ट रूप से ओवरराइड करें। इसलिए क्योंकि आपको इसे किसी भी तरह से ओवरराइड करने की आवश्यकता है, यह सही समझ में आता है कि आपको इसे प्रोटोटाइप में स्पष्ट रूप से ओवरराइड करने की आवश्यकता है। फ़ंक्शन अभी भी हटा दिया गया है अन्यथा।
एक ठोस उदाहरण के लिए: मान लीजिए कि आप एक List.hpp, List.cpp और main.cpp
List.hpp में आप एक अमूर्त वर्ग और एक नियमित रूप से वर्ग कि अमूर्त वर्ग से विरासत कर सकते है। मुख्य में आप #include "List.hpp"
और List.cpp नहीं, है ना? इसलिए कंपाइलर में कोई आईडीईए नहीं है जो उस फ़ाइल में है (जब तक कि इसे संकलित करने का प्रयास न हो।) यदि आपके पास हटाए गए वर्चुअल फ़ंक्शन को ओवरराइड नहीं किया गया है तो संकलक सोचता है कि आप बस एक सार वर्ग को तुरंत चालू करने और त्रुटि को फेंकने की कोशिश कर रहे हैं।
दूसरी ओर, यदि आप List.cpp संकलित कर रहे हैं, तो संकलक भी एक त्रुटि फेंक देगा, इस बार शिकायत करेगा कि जिस फ़ंक्शन को आप लिखने का प्रयास कर रहे हैं उसे वास्तव में परिभाषित नहीं किया गया है। क्योंकि Base::deletedFunction()
Derived::deletedFunction()
से अलग है।
आपने इसे बहुत बेहतर समझा है :) –
मैं मानता हूं, यह शायद मेरे रैंपिंग उत्तर, +1 से अधिक समझ में आता है। – OmnipotentEntity
क्या व्युत्पन्न वर्ग सार है या नहीं, एक स्पष्ट "अमूर्त" कीवर्ड के साथ जाना जा सकता है जिसे सी ++ की कमी है। –