2013-02-27 120 views
6

मुझे उत्सुकता है कि क्यों नया सी ++ 11 कीवर्ड overridevirtual के बजाय const के साथ विधिवत घोषणा के बाद दिखाई देने के लिए मजबूर होना चाहिए?वर्चुअल के समान स्थान की बजाय सदस्य घोषणा के बाद ओवरराइड क्यों किया गया था?

class SomeBaseClass { 
    virtual void DoPolymorphicBehavior() = 0; 
    ... 
class SomeDerrivedClass : public SomeBaseClass { 
    void DoPolymorphicBehavior() override; 
    ... 

क्यों में दुनिया एक ही सटीक स्थिति में इसकी अनुमति नहीं है (और यहां तक ​​कि बजाय) virtual

class SomeBaseClass { 
    virtual void DoPolymorphicBehavior() = 0; 
    ... 
class SomeDerrivedClass : public SomeBaseClass { 
    override void DoPolymorphicBehavior(); 
    ... 

यह मैं व्युत्पन्न वर्ग के लिए खोज मेरी स्रोत फ़ाइलों में & की जगह करने की अनुमति दी है | नए कीवर्ड का उपयोग करने के लिए और इस प्रकार त्रुटियों को खोजने में संकलक से सहायता प्राप्त करें। हालांकि, क्योंकि सी ++ 11 इसे सिंटैक्टिक रूप से एक अलग स्थिति में रखता है, इसलिए मुझे नई कंपाइलर सुविधा से कोई लाभ प्राप्त करने के लिए सचमुच स्रोत कोड की हजारों लाइनों को मैन्युअल रूप से अपडेट करना होगा।

निश्चित रूप से इस विकल्प के पीछे एक अच्छा कारण था?

+0

यदि कोई है (वहां होना चाहिए) तो मैं इसके पीछे तर्क जानना चाहता हूं। यदि पूछने के लिए कोई बेहतर जगह है, तो कृपया दिशा को इंगित करें ... – Mordachai

+2

मुझे नहीं पता कि इन भाषा डिज़ाइन प्रश्नों को बंद करने के लिए कौन से वोट वोट करते हैं। यदि वैध कारण है तो ओपी को पता नहीं है, तो यह सुनने में हस्तक्षेप कर सकता है। यदि वहां नहीं है और यह पासा फेंक रहा है, या स्वाद द्वारा तय किया गया है, तो यह भी एक जवाब है। और मुझे मत बताओ कि कोई भी नहीं जानता कि समिति वास्तव में क्या सोच रही थी, वहां पर्याप्त लोग हैं जो जानते हैं। मेरे द्वारा +1, इस विकल्प के बारे में सोचा नहीं था। –

उत्तर

10

फ़ंक्शन नाम से पहले प्रकट होने वाले घोषणा विनिर्देश अनुक्रम में एक पहचानकर्ता हो सकता है (उदाहरण के लिए, फ़ंक्शन का रिटर्न प्रकार)। कल्पना कीजिए कि कुछ मौजूदा कोड override की वापसी प्रकार था:

override foo(); 

या यहां तक ​​कि एक चर override कहा जाता है:

int override; 

एक नया कीवर्ड override का परिचय किसी भी मौजूदा कोड है कि एक पहचानकर्ता नामित override क्योंकि कीवर्ड नहीं थे टूट जाएगा आरक्षित हैं override (और यह भी final):

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

इसलिए फ़ंक्शन तर्कों के बाद इसे रखा गया कारण है क्योंकि नए कीवर्ड शुरू करने से पुराना कोड टूट जाएगा और यदि कंपाइलर override देखता है तो वे जानते हैं कि इसका क्या अर्थ है, क्योंकि कोई अन्य पहचानकर्ता यहां दिखाई नहीं दे सकता है।

+0

मैं यह भी जोड़ दूंगा कि फ़ंक्शन के बाद इसे डालने से यह स्पष्ट हो जाता है कि कार्य महत्वपूर्ण है और वापसी प्रकार नहीं है। उन्हें पहले से ही 'कॉन्स' के साथ समस्या थी और उन्हें फ़ंक्शन के बाद इसे रिटर्न टाइप क्वालीफायर के साथ उलझन में नहीं डालने के लिए मजबूर होना पड़ा। – Morwenn

+0

जबकि उनके पास वर्चुअल के साथ यह समस्या है? नहीं, मुझे लगता है कि यह अनियोजित विकास का एक दुर्भाग्यपूर्ण परिणाम है। क्या कोई भी जमीन से सी ++ डिजाइन कर रहा था (कहें, सी #, जावा, इत्यादि), वे क्वालीफायर पहले रखेंगे, क्योंकि यह पठनीयता के साथ और मानव दिमाग कैसे काम करता है। एक पोस्ट-क्वालिफ़ायर होने के बाद, हमेशा एक दुर्भाग्यपूर्ण विकल्प/सी से लटका होगा। ओवरराइड बनाना और अंतिम बनाना इस पैटर्न का पालन करना पिछड़ा संगतता के कारण एक आवश्यक बुराई है, डिजाइन-प्रतिभा, इमो के कुछ स्ट्रोक नहीं। – Mordachai

+0

@ मोर्दचाई विशेषण को ध्यान में रखते हुए अंग्रेजी में एक नाम से पहले रखा जाता है, मैं मानता हूं कि कार्यों को समझने से पहले क्वालीफायर लगाने के लिए यह अधिक है। आईएमएचओ, यह मानव मस्तिष्क की तुलना में प्राकृतिक भाषा का एक सवाल है। मेरी भाषा में - फ्रांसीसी -, विशेषण अक्सर संज्ञा के बाद पु होते हैं, और क्वालीफायर के लिए इसे करने से मुझे परेशान नहीं होता है। ठीक है, चूंकि अधिकांश प्रोग्रामिंग भाषाएं अंग्रेजी का उपयोग करती हैं, यह तर्कसंगत है कि यह एक डिजाइन विकास से अधिक पीछे की संगतता है। – Morwenn

7

यह कोई कीवर्ड नहीं है और यह आपके प्रश्न का उत्तर भी है।

यह कुछ संदर्भों में एक विशेष अर्थ के साथ एक पहचानकर्ता है। अगर इसे घोषणा की शुरुआत में दिखाई देने की अनुमति दी गई थी, तो उपयोगकर्ता द्वारा परिभाषित रिटर्न टाइप नाम के साथ संदिग्ध हो सकता है।

+0

तो यह है ... क्या? – Mordachai

+0

@Mordachai एक प्रासंगिक कीवर्ड – Praetorian

+0

तो यह तर्क है: किसी कीवर्ड को पेश करने से बचने के लिए, इसे एक प्रासंगिक कीवर्ड बनाया गया था, जिसका अर्थ है कि इसे विधि घोषणा के बाद दिखाना था? – Mordachai

2

क्योंकि override और final कीवर्ड नहीं हैं, लेकिन प्रतीकों, जो उपयोगकर्ता कोड में प्रदर्शित हो सकते हैं। (यानी आपके पास एक चर int override; हो सकता है।) वे केवल सीमित संदर्भों में अपना विशिष्ट अर्थ लेते हैं, और उन संदर्भों को पर चुना जाना चाहिए जहां एक उपयोगकर्ता परिभाषित प्रतीक प्रकट नहीं हो सकता है।इच्छा यह तुरंत स्पष्ट करने के लिए भी थी; में तरह के मामले:

override void DoSomething(); 

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