सी ++ 11 जोड़ा गया अंतिम।क्या सी ++ अंतिम सभी पहलुओं में अंतिम रूप से अंतिम है?
अंत में!
मैं समझता हूँ final
दो बातें करता है:
- एक वर्ग गैर दाय बनाता है।
- गैर-ओवर्रिडेबल (व्युत्पन्न कक्षा में) कक्षा में (वर्चुअल) फ़ंक्शन बनाता है।
ये दोनों एक दूसरे से स्वतंत्र प्रतीत होते हैं। लेकिन उदाहरण के लिए ले निम्नलिखित:
class Foo
{
public:
virtual void bar()
{
//do something unimportant.
}
};
class Baz final : public Foo
{
public:
void bar() /*final*/ override
{
//do something more important than Foo's bar.
}
};
ऊपर से, मेरा मानना है कि Baz
जा रहा है final
, मैं नहीं कि अपनी virtual
सदस्य समारोह bar
भी final
है निर्दिष्ट करने की आवश्यकता चाहिए। चूंकि Baz
विरासत में नहीं मिला है, bar
ओवरराइड करने का सवाल दायरे से बाहर हो गया है। हालांकि मेरे कंपाइलर वीसी ++ 2015, इस बारे में बहुत शांत है। मैंने इस समय किसी अन्य पर इसका परीक्षण नहीं किया है।
अगर कोई इस विषय पर कुछ प्रकाश डाल सकता है तो मुझे खुशी होगी। मानक (यदि कोई है) से उद्धरण की अत्यधिक सराहना की जाएगी। कृपया किसी भी कोने के मामलों को बताएं जिन्हें मैं अनजान हूं, जिससे मेरी तार्किक विश्वास विफल हो सकती है।
तो, मेरे सवाल यह है: परोक्ष इसकेvirtual
कार्यों मतलबfinal
रूप में अच्छी तरह होने के लिए एकfinal class
करता है? इसे होना चाहिए? कृपया स्पष्ट करें।
कारण मैं पूछ रहा हूँ इस वजह से final
कार्यों de-वर्चुअलाइजेशन है, जो एक महान अनुकूलन है के लिए योग्य हो जाते हैं। किसी भी मदद की सराहना की है।
अंतिम कार्य केवल तभी वर्चुअलाइज्ड होते हैं जब स्थैतिक प्रकार उस कार्य से मेल खाता है जहां फ़ंक्शन अंतिम होता है। शायद ही कभी होता है, और अक्सर इस तथ्य का एक संकेत है कि पहली जगह में कोई वर्चुअल की आवश्यकता नहीं है। – SergeyA
@ सेर्गेया हां। यही कारण है कि मैंने योग्यता लिखी। –
यदि संकलक गारंटी दे सकता है कि उसे वर्चुअल कॉल की आवश्यकता नहीं है तो यह वर्चुअल कॉल (ऑप्टिमाइज़ेशन के रूप में) नहीं लगाएगा। कंपाइलर चालाक है और पहले से ही यह फाइनल की शुरूआत पहले से ही किया था। लेकिन मुझे लगता है कि अब यह आसान है। –