Wednesday, 15 January 2014

templates - C++ same name for non-virtual function in derived class conflicts with `final` specifier -


यह एक पूर्ण नौसिखिया प्रश्न का भाव है, लेकिन अंतिम स्पेसिफायर B :: ऑपरेटर () ?

  struct A {virtual void operator () () () const = 0 के लिए प्रयोग किया जाता है; }; // सीआरटीपी घटक वास्तव में यहां नहीं जरूरी है / लेकिन यह संभवत: अधिक समझ में आता है कि इसे इस तरह वास्तविकता में लागू किया जा सकता है // टेम्पलेट & gt; Typameame Derived & gt; Struct बी: ए {आभासी शून्य ऑपरेटर () () const ओवरराइड अंतिम {static_cast & lt; Derived const & amp; & gt; (* यह)। ऑपरेटर () (); }}; संरचना सी: बी & lt; C & gt; {शून्य ऑपरेटर () () const {// कुछ करना}}; Int main () {सी () (); }  

जी + + निम्न प्रिंट करता है:

  main.cpp: 17: 14: त्रुटि: आभासी फ़ंक्शन 'वर्चुअल शून्य सी :: ऑपरेटर () () कॉन्स्ट 'शून्य ऑपरेटर () () const ^ main.cpp: 9: 22: त्रुटि: ओवरराइडिंग अंतिम फ़ंक्शन' शून्य बी & लेफ्टिनेंट; डिलीएटेड & gt; :: ऑपरेटर () () const [साथ में व्युत्पन्न = सी] 'वर्चुअल शून्य ऑपरेटर () ( ) Const ओवरराइड अंतिम ^  

मैंने सोचा होगा कि यह गैर-वर्चुअल C :: ऑपरेटर () के रूप में काम करता है इसके आधार वर्गों में वर्चुअल फ़ंक्शंस को ओवरराइड नहीं करता है ? मैं इसे कैसे काम में ला सकता हूं (- C :: operator () ) का नाम बदलने के बिना?


संपादित करें : के रूप में कई उपयोगकर्ताओं ने बताया, इसका उत्तर केवल यह है कि व्युत्पन्न वर्ग में वर्चुअल -keyword अनावश्यक है (जबकि मुझे लगता है कि इसे छोड़ने से इनहेरिटिंग से रोका जा सकेगा)। हालांकि, मैं यह पूछने में लक्ष्य था- अर्थात् गतिशील और स्थैतिक उत्तराधिकार पदानुक्रम में एक सुसंगत इंटरफ़ेस - एक गैर-वर्चुअल ऑपरेटर [] का उपयोग करके हल किया जा सकता है एक वर्चुअल फ़ंक्शन द्वारा और बी पूर्णांक और जोड़े वर्गों लागू करें :

  struct ए {शून्य ऑपरेटर ) () कॉन्स्ट {यह- & gt; लागू (); } संरक्षित: आभासी शून्य लागू () const = 0; }; टेम्पलेट & lt; typename derived & gt; संरचना बी: एक {शून्य ऑपरेटर () () const {static_cast & lt; Derived const & amp; & gt; (* यह)। ऑपरेटर () (); } सुरक्षित: आभासी शून्य लागू () const ओवरराइड अंतिम {यह- & gt; ऑपरेटर () (); }}; संरचना सी: बी & lt; C & gt; {शून्य ऑपरेटर () () const {// कुछ करना}}; Int main () {सी () (); }  

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

यह बदला नहीं जा सकता, इसलिए यदि आप वास्तव में को एक व्युत्पन्न वर्ग में समान नाम के साथ एक फ़ंक्शन की आवश्यकता होती है जो आधार वर्ग से वर्चुअल फ़ंक्शन को ओवरराइड नहीं करता है (और इस प्रक्रिया में, स्वयं वर्चुअल हो जाता है और इस मामले में, कोड> अंतिम में बी ) आपको व्युत्पन्न कक्षा में फ़ंक्शन के हस्ताक्षर को बदलना होगा। इसका अर्थ एक अलग नाम, भिन्न पैरामीटर सूची या विभिन्न क्वालिफायर हो सकता है। मैं बाद के दो चरम सावधानी के साथ इलाज करेगा - संकलक आपके द्वारा बनाई गई गड़बड़ी को सुलझाने में सक्षम होगा, लेकिन बहुत से मानव पाठक (बहुत आसानी से) आश्चर्यचकित हो सकते हैं।

अगर मैं इस तरह के कोड की समीक्षा कर रहा था, तो मैं शायद इसे एक समस्या के रूप में उद्धृत करूँगा, और लेखक को इसे स्वीकृत करने के लिए वास्तव में क्यों आवश्यक था, इसके लिए बहुत ठोस तर्क देने की आवश्यकता होगी। / P>


No comments:

Post a Comment