2011-10-13 22 views
13

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

उत्तर

21

सी ++ में यदि आप बेस क्लास में virtual विधि घोषित करते हैं तो यह वर्चुअल क्लास में वर्चुअल भी है, भले ही virtual कीवर्ड छोड़ा गया हो।

दस्तावेज़ीकरण उद्देश्यों के लिए हालांकि मेरी राय में वैसे भी इसे दोहराना अच्छा लगता है।

0

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

2

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

+3

यह कंपाइलर के लिए अनावश्यक हो सकता है लेकिन यह वर्ग का उपयोग कर किसी भी मानव के लिए अच्छा प्रलेखन है। –

+0

@ लोकी एस्टारी: सही। – PlasmaHH

5

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

1

व्युत्पन्न वर्ग पर प्रभाव डालने के लिए बनाई गई वर्चुअल विधियां (जब आप वर्चुअल के रूप में विधि को चिह्नित करते हैं। यह व्युत्पन्न कक्षाओं पर vtable का उपयोग करेगा)। और ओवरराइड विधियां आभासी होंगी।

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