2017-05-24 15 views
25

मैं एक भयानक awesome C++11 tutorial पढ़ रहा हूँ और जब तक final कीवर्ड समझा लेखक इस उदाहरण प्रदान करता है:यह एक वर्ग के कोई आधार वर्ग है कि में आभासी समारोह के लिए अंतिम कीवर्ड जोड़ने के लिए कोई मतलब है (व्युत्पन्न नहीं है)

struct B { 
    virtual void f() const final; // do not override 
    virtual void g(); 
}; 
struct D : B { 
    void f() const;  // error: D::f attempts to override final B::f 
    void g();  // OK 
}; 

तो क्या यह final कीवर्ड का उपयोग करके समझ में आता है? मेरी राय में आप यहां वर्चुअल कीवर्ड का उपयोग करने से बच सकते हैं और ओवरराइड होने से f() को रोक सकते हैं।

+2

मैं इसे दस्तक नहीं देना चाहता, क्योंकि एक गुरु साथ आ सकता है और एक केस-केस पेश कर सकता है जहां यह कुछ वास्तव में अस्पष्ट संकलन त्रुटि हल करता है ... लेकिन ऐसा करने के लिए मूर्खतापूर्ण चीज दिखती है। – StoryTeller

+2

संभावित डुप्लिकेट [क्या वर्चुअल और फाइनल दोनों के रूप में बेस क्लास फ़ंक्शन को चिह्नित करने में कोई समझ है?] (Https://stackoverflow.com/questions/16739135/is-there-any-sense-in-marking-a-base -क्लास-फ़ंक्शन-ए-वर्चुअल-एंड-फाइनल) –

+0

असल में अधिक डुप्लिकेट हैं, उदाहरण के लिए [अंतिम वर्चुअल फ़ंक्शन का बिंदु क्या है?] (Https://stackoverflow.com/questions/11704406/) – Ruslan

उत्तर

32

यदि आप फ़ंक्शन को virtual और final के रूप में चिह्नित नहीं करते हैं तो बाल-वर्ग अभी भी फ़ंक्शन को कार्यान्वित कर सकता है और बेस-क्लास फ़ंक्शन को छुपा सकता है।

समारोह virtual और final बनाने बच्चे स्तरीय ओवरराइड नहीं कर सकते या समारोह को छिपाने के द्वारा।

+2

मुझे पता था कि एक गुरु साथ आएगा। हालांकि मुझे लगता है कि यह छिपाने से रोकने के लिए ओवरहेड (जो हो सकता है या नहीं किया जा सकता है) के रास्ते में थोड़ा अधिक है। +1। – StoryTeller

+2

स्पष्ट रूप से इस मामले पर सर्वसम्मति है, लेकिन मैं किसी के लिए कुछ भी उपयोगी नहीं करने के बारे में एक स्पष्टीकरण देना चाहता हूं * और * एक और भाषा सुविधा तोड़ना एक लाभ माना जाएगा। – Quentin

+1

@ क्वांटिन ने अस्पष्टता की संभावना को हटा दिया, उदा। 'टेम्पलेट शून्य डूस्टफ (DerivedFromB और बी) {b.f() के मामले में; } ', आप 100% सुनिश्चित हो सकते हैं कि' f() 'कॉल – Caleth

2

आपका अंतर्ज्ञान सही है: virtual फ़ंक्शन बनाना केवल final के साथ इसे तुरंत कैप्चर करने के लिए गैर-वर्चुअल फ़ंक्शन पर कोई लाभ नहीं है। यह सुविधा का प्रदर्शन करने के लिए यह एक छोटा सा नमूना स्निपेट है।

इसके अतिरिक्त, जैसा कि अन्य उत्तरों में वर्णित है, यह वास्तव में फ़ंक्शन छिपाने को तोड़ता है - आप फ़ंक्शन को D या उसके किसी व्युत्पन्न कक्षाओं में समान पैरामीटर सूची के साथ कभी भी सक्षम नहीं होंगे।
जब आप अपने मॉडल में f को कैप करने का निर्णय लेते हैं तो यह एक व्यापार-बंद होता है। चूंकि यहां वास्तविक वर्चुअल कॉल करने का कोई तरीका नहीं है, इसलिए आपको अनिवार्य रूप से नुकसान और कोई लाभ नहीं है।

+1

मैंने नाम छिपाने के बारे में सोचा। इस प्रकार आप व्युत्पन्न वर्ग को f() को छिपाने के लिए रोकते हैं। यदि आप वर्चुअल कीवर्ड के बिना f() घोषित करते हैं, तो मुझे अनुमानित वर्ग में छुपाया जा सकता है। –

+0

टिप्पणियां, हमेशा की तरह, डाउनवॉट्स के साथ बहुत सराहना की जाती हैं। – Quentin

+1

मुझे लगता है कि डाउनवॉट नाम छिपाने को अक्षम करने के प्रति आपके दृष्टिकोण के कारण हैं। मुझे लगता है कि इस सुविधा का वास्तव में कुछ विशेष उद्देश्य के लिए उपयोग किया जा सकता है, हालांकि मैं अपने सिर के ऊपर से इस तरह के किसी भी उद्देश्य का नाम नहीं दे सकता। – Ruslan

11

हाँ! उदाहरण में आप प्रदान करते हैं, final कीवर्ड किसी व्युत्पन्न कक्षाओं को f() ओवरराइड करने से रोकता है जैसा कि आप सही ढंग से कहते हैं। समारोह गैर आभासी है, तो D:f()छिपाने समारोह के आधार वर्ग संस्करण के लिए अनुमति दी है:

struct B { 
    void f() const; // do not override 
    virtual void g(); 
}; 
struct D : B { 
    void f() const; // OK! 
    void g();  // OK 
}; 

अधिभावी या छुपा एक संकलन त्रुटि होती है पर f() एक virtual और final समारोह, किसी भी प्रयास करने से।

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