क्या इन दोनों के बीच अंतर है:वर्चुअल विधि को ओवरलोड करने से गैर-वर्चुअल विधि से भिन्न होता है?
- आधार वर्ग समारोह आभासी घोषणा और व्युत्पन्न वर्ग समारोह बदलते।
- विरासत में गैर-वर्चुअल फ़ंक्शन ओवरलोड करना।
आप दूसरे पर एक का उपयोग कब करेंगे?
क्या इन दोनों के बीच अंतर है:वर्चुअल विधि को ओवरलोड करने से गैर-वर्चुअल विधि से भिन्न होता है?
आप दूसरे पर एक का उपयोग कब करेंगे?
जब आप एक आधार वर्ग विधि virtual
रूप में घोषित किया है, ताकि इसे ओवरराइड करने के लिए आपको व्युत्पन्न वर्ग में ठीक उसी हस्ताक्षर (सह संस्करण वापसी प्रकार हालांकि अनुमति दी जाती है) के साथ एक समारोह प्रदान करने की आवश्यकता है।
अपने कार्य का नाम एक ही है, लेकिन व्युत्पन्न वर्ग में हस्ताक्षर की तुलना में यह अब और overidding नहीं है, यह function Hiding है, व्युत्पन्न वर्ग विधि आधार वर्ग विधि छुपाता बेस कक्षा में एक से भिन्न होता है, तो।
फ़ंक्शन ओवरलोडिंग कभी भी कक्षाओं में पार नहीं होता है, आप उसी कक्षा या मुक्त कार्यों के अंदर विधियों को अधिभारित कर सकते हैं लेकिन कक्षाओं में नहीं। जब आप इसे कक्षाओं में पार करने का प्रयास करते हैं जो आपको अंततः मिलते हैं तो कार्य छिपाना होता है।
अपनी व्युत्पन्न कक्षा के दायरे में बेस क्लास विधियों को लाने के लिए आपको अपनी व्युत्पन्न कक्षा में
अतिरिक्त using functionName
जोड़ने की आवश्यकता है।
संपादित करें:
जब से अधिक भार से अधिक virtual
उपयोग करने के लिए के क्यू का सवाल है, जवाब है:
आप अपने वर्ग के कार्यों क्रम बहुरूपता आप उन्हें virtual
के रूप में चिह्नित करना चाहिए के लिए अधिरोहित जा करना चाहते हैं, और यदि आप ऐसा नहीं करना चाहते हैं।
अच्छा पढ़ें:
When to mark a function in C++ as a virtual?
ओवरलोडिंग से (orthogonal करने के लिए) आभासी अधिभावी पूरी तरह अलग है।
ओवरराइडिंग में, एक फ़ंक्शन को एक समान हस्ताक्षर के साथ प्रतिस्थापित किया जाता है। तब कुछ नियम "सबसे ओवरराइडिंग" फ़ंक्शन चुनने के लिए हैं, जो वर्चुअल फ़ंक्शंस के लिए सबसे अधिक व्युत्पन्न कक्षा में परिभाषित किया गया है। आभासी कार्यों के लिए एक विशेष मामले के रूप में, हस्ताक्षर के वापसी प्रकार थोड़ा अलग हो सकते हैं (covariance)।
ओवरलोडिंग में, विभिन्न तर्क प्रकारों के साथ फ़ंक्शन हस्ताक्षर एक साथ फ़ंक्शन कॉल करते समय चुने जाने वाले उम्मीदवारों के रूप में कार्य करते हैं। सही चुनने के लिए नियमों का एक अविश्वसनीय रूप से जटिल सेट है, जो 9 5% समय पर अच्छी तरह से काम करता है और जब यह सहयोग नहीं करता है तो आपको सिरदर्द देता है।
चूंकि अधिभार विभिन्न हस्ताक्षरों के साथ काम करता है और उसी हस्ताक्षर के साथ ओवरराइडिंग काम करता है, इसलिए वे वास्तव में एक दूसरे के साथ हस्तक्षेप नहीं करते हैं।
ओवरलोडेड फ़ंक्शन नाम का विस्तार करने के लिए आप मूल श्रेणी के कार्यों को स्पष्ट रूप से एक व्युत्पन्न कक्षा में आयात कर सकते हैं। यह व्युत्पन्न कक्षा के अंदर using base_class::overload_name;
द्वारा किया जाता है।
मेरा मानना है कि आप गैर वर्चुअल फ़ंक्शंस को ओवरराइड करना चाहते हैं और ओवरलोडिंग नहीं करना चाहते हैं। जब आप व्युत्पन्न कक्षा में एक गैर वर्चुअल बेस क्लास फ़ंक्शन को ओवरराइड करते हैं, तो फ़ंक्शन को कॉल संकलित समय पर हल और बाध्य किया जाता है। इसका अर्थ यह है कि फ़ंक्शन कॉल को टाइप (या पॉइंटर) के आधार पर हल किया जाता है जिस पर फ़ंक्शन कहा जाता है। यदि आप बेस क्लास पॉइंटर पर फ़ंक्शन को कॉल कर रहे हैं तो बेस क्लास संस्करण हमेशा कहा जाता है। यदि आप व्युत्पन्न क्लास पॉइंटर का उपयोग करते हैं तो व्युत्पन्न संस्करण हमेशा कहा जाता है; वास्तविक वस्तु के बावजूद जो यह इंगित कर रहा है।
यदि बेस क्लास संस्करण वर्चुअल के रूप में चिह्नित किया गया है तो कॉल रेज़ोल्यूशन या बाइंडिंग को उस ऑब्जेक्ट के प्रकार के आधार पर रनटाइम पर बनाया जाना चाहिए, जिस पर कॉल किया जाता है और पॉइंटर के प्रकार के आधार पर नहीं किया जाता है कॉल करना। इसका मतलब है कि आप बेस क्लास पॉइंटर का उपयोग बेस और व्युत्पन्न क्लास ऑब्जेक्ट्स को इंगित करने के लिए कर सकते हैं और फिर फ़ंक्शन को कॉल कर सकते हैं। ऑब्जेक्ट के प्रकार के आधार पर पॉइंटर इंगित कर रहा है, संबंधित फ़ंक्शन संस्करण कहा जाता है। इसका मतलब है कि यदि मेरा सूचक बेस क्लास ऑब्जेक्ट को इंगित कर रहा है तो बेस क्लास संस्करण कहा जाता है। यदि पॉइंटर बिंदु ऑब्जेक्ट को व्युत्पन्न करता है तो व्युत्पन्न verion कहा जाता है।
एक व्युत्पन्न वर्ग ** ओवरडिड्स ** बेस क्लास फ़ंक्शन कहने के लिए, कीवर्ड 'आभासी' को शामिल नहीं किया जाना चाहिए, अगर यह ओवरडिंग नहीं है। –
नहीं, यह अभी भी ओवरराइडिंग है। लेकिन, यदि आप वर्चुअल का उपयोग नहीं करते हैं तो बेस क्लास संस्करण को व्युत्पन्न क्लास संस्करण द्वारा प्रतिस्थापित किया जाता है। और यह चुनने का कोई तरीका नहीं है कि आप किस संस्करण का उपयोग करना चाहते हैं। अब, यदि आप अभी भी सभी ओवरराइड संस्करणों को उपलब्ध करना चाहते हैं तो आपको उन्हें वर्चुअल के रूप में चिह्नित करना चाहिए। – Drona
आपको इसे तोड़ने के लिए खेद है, लेकिन यह गलत है, यदि कोई वर्चुअल' कीवर्ड नहीं है तो यह अधिक नहीं हो रहा है। –
व्युत्पन्न कक्षा में बेस क्लास सदस्य फ़ंक्शन को अधिभारित करने के लिए, आपको केवल 'उपयोग' घोषणा की आवश्यकता है। – Potatoswatter
@Potatoswatter: हां, आपको केवल विधियों को प्रदान करने के अलावा ऐसा करने की आवश्यकता है ताकि उस अर्थ में यह अधिभारित संस्करण प्रदान करने से कहीं अधिक हो। –
मैं भी एक उत्तर तैयार करने की कोशिश कर रहा था, लेकिन मैं आधार वर्चुअल में फ़ंक्शन बनाने के बीच मतभेदों को समझा नहीं सकता था या नहीं। आप एक व्युत्पन्न वर्ग (एक अलग हस्ताक्षर के साथ) में एक ही तरीके से अधिभारित कर सकते हैं। और मुझे लगता है कि यह ओपी के सवाल का हिस्सा है। –