2015-04-20 6 views
21

सी ++ में किसी फ़ंक्शन पर virtual और override दोनों का उपयोग करना खतरनाक है? क्या यह आपको ओवरलोडिंग के साथ अस्पष्टता के लिए खोलता है?क्या सी ++ 11 में वर्चुअल और ओवरराइड कीवर्ड दोनों का उपयोग करने में कोई सबटाइटी हैं?

जाहिर virtual आधार वर्ग में इस्तेमाल किया जाना चाहिए और यह मूर्खतापूर्ण को व्युत्पन्न वर्ग में override का उपयोग नहीं हो सकता है, लेकिन यह वास्तव में व्युत्पन्न वर्ग मेंoverride साथ virtualउपयोग करने के लिए समस्याग्रस्त है?

यह निर्धारित करने की कोशिश कर रहा है कि यह शैली या शुद्धता का मुद्दा है या नहीं।

उदाहरण:

class Widget { 
    virtual void transmogrify() = 0; 
} 

class Gadget : public Widget { 
    virtual void transmogrify() override {} 
} 
+0

के रूप में घोषित आप यहां अपना उत्तर मिल सकती है [\ 'ओवरराइड \ 'सी ++ 11 में] (http://stackoverflow.com/questions/13880205/override-in-c11) – MicroVirus

+1

यह भी देखें http://en.cppreference.com/w/cpp/language/override – MicroVirus

+0

ओवरलोडिंग नहीं है ' टी में आओ। दोनों कीवर्ड केवल ओवर-राइडिंग पर लागू होते हैं। – EJP

उत्तर

30

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

क्योंकि override कीवर्ड ओवरराइडिंग होने पर संकलन त्रुटि का कारण बनता है, virtual कीवर्ड संयोजन में बेकार है।

यहाँ, एक cheatsheet है:

| Keyword used | Matching virtual function in base class | Result     | 
|--------------|-----------------------------------------|--------------------------| 
| Neither  | No          | New non-virtual function | 
| Neither  | Yes          | Override     | 
| virtual  | No          | New virtual function  | 
| virtual  | Yes          | Override     | 
| override  | No          | Compile error   | 
| override  | Yes          | Override     | 
| Both   | No          | Compile error   | 
| Both   | Yes          | Override     | 
1

अपने उदाहरण में आप के बारे में दो अलग-अलग है, लेकिन महत्वपूर्ण बातें कह रहे हैं Gadget की विधि transmogrify

virtual - एक वर्ग तो Gadgettransmogrify से निकला है, तो फ़ंक्शन को व्युत्पन्न कक्षा

override - वर्चुअल के रूप में वर्चुअल के रूप में माना जाएगा - Gadget कक्षा है transmogrify के बेस क्लास Widget के संस्करण को स्पष्ट रूप से ओवरराइड करना।

दो मुख्य कार्य ऑर्थोगोनल हैं और एक-दूसरे को प्रभावित नहीं करते हैं। override कीवर्ड के बारे में अच्छी बात यह है कि यह संकलक को बता रहा है कि आप विरासत वाले वर्चुअल फ़ंक्शन को ओवरराइड करने का प्रयास कर रहे हैं। यह संकलन आप आधार वर्ग पर समारोह के समारोह हस्ताक्षर मिलान में एक गलती की है, तो नहीं के रूप में यह एक विरासत समारोह को ओवरराइड चाहिए अगर एक override

+0

प्वाइंट एक 'विजेट' द्वारा सुनिश्चित किया गया था,' गैजेट' के मामले में कोई बात नहीं है, और निश्चित रूप से 'गैजेट' में 'आभासी' कीवर्ड की उपस्थिति में कोई फर्क नहीं पड़ता है। –

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