एक शुद्ध आभासी फ़ंक्शन को 0 से आरंभ क्यों किया जाता है?


147

हम हमेशा एक शुद्ध आभासी फ़ंक्शन की घोषणा करते हैं:

virtual void fun () = 0 ;

यानी, यह हमेशा 0 को सौंपा जाता है।

जो मैं समझता हूं कि यह इस फंक्शन के लिए वाइबल एंट्री को NULL को इनिशियलाइज़ करने के लिए है और यहाँ किसी भी अन्य वैल्यू का संकलन टाइम एरर होता है। यह समझ सही है या नहीं?


12
ध्यान दें कि व्यवहार्य एक भाषा की आवश्यकता नहीं है, लेकिन आभासी तरीकों के लिए सिर्फ एक कार्यान्वयन विकल्प है। एक कंपाइलर एक अलग अमल के साथ एक ही अमूर्तता पैदा कर सकता है (जो कि,
व्यवहार्य

@ अपने अनुपूरक प्रश्न को फिर से लिखें - यही मेरा उत्तर (और कई अन्य) कहता है।

बस जिज्ञासु, अगर मैं देता हूं तो क्या होता है, virtual void func() = 100;
कृतिकागोपालकृष्णन

जवाबों:


161

इस कारण =0का उपयोग किया जाता है कि ब्रेज़न स्ट्रॉस्ट्रुप ने नहीं सोचा था कि वह एक और कीवर्ड प्राप्त कर सकता है, जैसे कि "शुद्ध" अतीत के सी ++ समुदाय के समय जिस समय यह सुविधा लागू की जा रही थी। यह उनकी पुस्तक, द डिजाइन एंड एवोल्यूशन ऑफ सी ++ , सेक्शन 13.2.3 में वर्णित है :

जिज्ञासु = 0 सिंटैक्स चुना गया था ... क्योंकि उस समय मुझे नया कीवर्ड स्वीकार करने का कोई मौका नहीं मिला।

वह यह भी स्पष्ट रूप से बताता है कि यह NULL को व्यवहार्य प्रविष्टि सेट करने की आवश्यकता नहीं है, और ऐसा करना शुद्ध आभासी कार्यों को लागू करने का सबसे अच्छा तरीका नहीं है।


4
हाँ, यह सिर्फ वाक्यविन्यास है। मैंने बहुत सारे प्रोजेक्ट देखे हैं जो #define PURE = 0 है और वे कहेंगे आभासी शून्य Foo () PURE;
इ_म_जॉर्फ़

79
कृपया भगवान मुझे उन परियोजनाओं से दूर रखें :-)

27
यह #define BEGIN {#define END} ;-) की तुलना में बहुत कम खराब है और मैंने कभी-कभी ऐसा देखा है।
तून Krijthe

5
इस तरह की निफ्टी चीज मुझे लगता है कि C ++ बहुत पॉलिश नहीं है। यह बहुत अजीब है कि यह बहुत अधिक उपयोग किया जाता है। मुझे उम्मीद है कि गुजरते दिनों के साथ भाषा बेहतर होगी।
जोकून

19
इसलिए, दूसरे शब्दों में, "डिजाइन दोष" को पाने के लिए बज़्ने को "एक समय सीमा का सामना करना पड़ा" और "एक हैक का इस्तेमाल किया";) (बस मुखर होने के नाते)
कार्ल

78

C ++ के डिज़ाइन के बारे में अधिकांश "क्यों" प्रश्नों के साथ , बजरने स्ट्रॉस्ट्रुप 1 द्वारा डिजाइन और सी ++ का विकास, देखने का पहला स्थान है :

=0एक नए कीवर्ड को पेश करने के स्पष्ट विकल्प के लिए जिज्ञासु सिंटैक्स चुना गया था pureया abstractउस समय क्योंकि मुझे नए कीवर्ड को स्वीकार करने का कोई मौका नहीं मिला। अगर मैंने सुझाव दिया होता pure, तो रिलीज़ 2.0 ने अमूर्त कक्षाओं के बिना भेज दिया होता। एक अच्छे वाक्यविन्यास और अमूर्त वर्गों के बीच एक विकल्प को देखते हुए, मैंने अमूर्त कक्षाएं चुनीं। देरी को जोखिम में डालने और कुछ झगड़े को खत्म करने के बजाय pure, मैंने "नहीं" का प्रतिनिधित्व करने के लिए 0 का उपयोग करने की परंपरा सी और सी ++ सम्मेलन का इस्तेमाल किया। =0मेरी राय यह है कि एक समारोह शरीर (सरलीकृत, लेकिन आमतौर पर पर्याप्त) आभासी कार्यों के सेट को देखते हुए समारोह संकेत का एक वेक्टर के रूप में लागू किया जा रहा है एक समारोह के लिए भी प्रारंभकर्ता है साथ वाक्य रचना फिट। [...]

1 113.2.3 सिंटेक्स


29

सी ++ मानक की धारा 9.2 कक्षा के सदस्यों के लिए वाक्यविन्यास देता है। इसमें यह उत्पादन शामिल है:

pure-specifier:
    = 0

मूल्य के बारे में कुछ खास नहीं है। "= 0" यह कहने के लिए सिंटैक्स है "यह फ़ंक्शन शुद्ध आभासी है।" इसका आरंभीकरण या अशक्त बिंदुओं या संख्यात्मक मान शून्य से कोई लेना-देना नहीं है, हालांकि उन चीजों की समानता में मूल्य-संबंधी मूल्य हो सकते हैं।


5
C ++ मानक का संदर्भ देने के लिए +1। यह एक आश्चर्य की बात है कि सबसे अच्छा संभव जवाब में से एक और अब तक केवल 1 वोट मिला। C ++ प्रश्नों को हल करने के लिए मानक पढ़ना बहुत पहला चरण होना चाहिए।
mloskot

7
@mloskot: शायद क्योंकि यह ओपी के सवाल का जवाब नहीं देता है, बस स्थिति को शांत करता है?
सिर्फ

6
किसी के साथ अन्याय करना - इसमें वह मानक प्रशस्ति पत्र शामिल है जो बताता है कि शुद्ध आभासी फ़ंक्शन घोषणा के वाक्य विन्यास = 0क्या है और वाक्य रचना शुद्ध-निर्दिष्ट का उपयोग करता है आप और क्या जानना चाहेंगे? यह वही होगा जो यह पूछेगा कि फ़ंक्शन बॉडी को {} के साथ क्यों लपेटा गया है, इसका उत्तर होगा, क्योंकि यही C ++ सिंटैक्स परिभाषित करता है।
mloskot

19

मुझे यकीन नहीं है कि इसके पीछे कोई अर्थ है। यह भाषा का सिंटेक्स मात्र है।


16

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

= 0के बाद से यह करने के लिए एक vtable प्रविष्टि की स्थापना जैसा दिखता है वाक्य रचना वास्तव में चुना गया है हो सकता है 0, लेकिन यह विशुद्ध प्रतीकात्मक है। (अधिकांश कंपाइलर एक स्टब के लिए ऐसी वाइब्रेट एंट्री देते हैं, जो प्रोग्राम को निरस्त करने से पहले एक त्रुटि का कारण बनता है।) सिंटैक्स को मुख्य रूप से इसलिए चुना गया क्योंकि इसे पहले किसी भी चीज़ के लिए इस्तेमाल नहीं किया गया था और इसने एक नए कीवर्ड को शुरू करने से बचाया था।


3
एक नया कीवर्ड शुरू करने के नुकसान को समझाने के लिए +1। यह तर्क को समझने में मददगार है, लेकिन C ++ सिंटेक्स मुझे बेतुका लगता है और मुझे लगता है कि उन्होंने इसे और अधिक मानव-पठनीय बना दिया होता - एक pureकीवर्ड मेरी पुस्तक में बहुत अच्छा होता। वैसे भी औचित्य समझने के लिए अच्छा है।
कीथ पिंसन

@KeithPinson यदि आप एक शुद्ध कीवर्ड चाहते हैं, तो आप ऐसा कर सकते हैं #define pure = 0
jdh8

@ jdh8: ऊ बस ... ऊ।
एसबी

एक साइड नोट के रूप में, बज़्ने के साथ एक कक्षा में उन्होंने कहा कि वह वास्तव में "शुद्ध" कीवर्ड को C ++ में प्राप्त करना चाहते थे ... लेकिन उन्होंने C ++ कंपाइलर को शिप करने से पहले इसे चक्र में बहुत देर से प्राप्त करने की कोशिश की (IIRC) कम से कम दो सप्ताह)। मूल रूप से, इसने इसे नहीं बनाया।
ThePhD

@ ThePhD: ISTR वह यह भी डी एंड ई में कहीं कहता है। (हालांकि, मैं इसे देखने के लिए बहुत आलसी हूं।)
sbi

11

C ++ के पास सामान्य वर्चुअल फ़ंक्शन की घोषणा से शुद्ध वर्चुअल फ़ंक्शन को अलग करने का एक तरीका होना चाहिए। उन्होंने = 0वाक्य रचना का उपयोग करना चुना । वे केवल एक शुद्ध कीवर्ड जोड़कर आसानी से ऐसा कर सकते थे। लेकिन C ++ नए कीवर्ड जोड़ने और सुविधाओं को पेश करने के लिए अन्य तंत्रों का उपयोग करने के लिए पसंद करने के लिए बहुत कम है।


2
-0: जब आपके पास अपने दम पर कहने के लिए कुछ भी नहीं है, तो एक व्यापक उद्धरण का उपयोग करें (देखें जेरी कॉफिन के जवाब के लिए //!)
बस किसी को

7

इस मामले में कुछ भी "initilaized" या "असाइन किया गया" शून्य नहीं है। टोकन और टोकन से = 0युक्त सिर्फ़ एक वाक्यात्मक निर्माण में , जिसका आरंभीकरण या असाइनमेंट से कोई संबंध नहीं है।=0

इसका "वीटेबल" में किसी वास्तविक मूल्य से कोई संबंध नहीं है। C ++ भाषा में "vtable" या इस तरह anythng की कोई धारणा नहीं है। विभिन्न "vtables" विशिष्ट कार्यान्वयन के विवरण से अधिक कुछ नहीं हैं।


3

मुझे याद है कि मज़ेदार वाक्य रचना का औचित्य यह था कि यह एक और कीवर्ड को पेश करने की तुलना में आसान (मानकों-स्वीकृति के मामले में) था जो एक ही बात करेगा।

मेरा मानना ​​है कि यह ब्रेज़न स्ट्रॉस्ट्रुप द्वारा द डिज़ाइन एंड एवोल्यूशन ऑफ़ सी ++ में उल्लेख किया गया था।


2

मुझे लगता है कि यह C ++ व्याकरण का सिर्फ एक हिस्सा है। मुझे नहीं लगता कि किसी भी विशिष्ट बाइनरी प्रारूप के लिए कंपाइलर वास्तव में इसे कैसे लागू करते हैं, इस पर कोई प्रतिबंध नहीं है। आप मान रहे हैं कि शायद शुरुआती दिन सी ++ कंपाइलर के लिए सही था।


2

= 0एक शुद्ध आभासी फ़ंक्शन की घोषणा करता है

यह समझ में आ रहा है कि यह इस समारोह के लिए VULL एंट्री को NULL को इनिशियलाइज़ करना है और यहाँ किसी भी अन्य मूल्य का संकलन टाइम एरर होता है।

मुझे नहीं लगता कि यह सच है। यह सिर्फ विशेष वाक्यविन्यास है। व्यवहार्य कार्यान्वयन-परिभाषित है। कोई भी नहीं कहता है कि शुद्ध सदस्य के लिए एक व्यवहार्य प्रविष्टि वास्तव में निर्माण पर शून्य होनी चाहिए (हालांकि अधिकांश संकलक vtables को समान रूप से संभालते हैं)।


4
यह वास्तव में सच नहीं है। शुद्ध आभासी फ़ंक्शन के लिए परिभाषा प्रदान करने में कुछ भी गलत नहीं है । केवल एक चीज = 0पूरी कक्षा को सारगर्भित बनाती है और शुद्ध कार्यों के लिए आभासी कॉल पर रोक लगाती है। गैर-आभासी कॉल अभी भी पूरी तरह से ठीक हैं, जो तब है जब परिभाषा (यदि आपने एक प्रदान की है) का उपयोग किया जाता है।
चींटी

बस गॉडबॉल्ट आउटपुट देखें। अस्पष्टता या अटकलों के लिए जगह नहीं है। मैं बाद में खुद देख लूंगा
लुईस केल्सी

ऐसा लगता है कि यह आधार की जगह __cxa_pure_virtual arobenko.gitbooks.io/bare_metal_cpp/content/compiler_output/… के साथ प्रविष्टि की जगह लेता है :: f ()
लुईस केल्सी

1

ठीक है, आप वास्तविक फ़ंक्शन को इंगित करने के लिए व्यवहार्य प्रविष्टि को इनिशियलाइज़ कर सकते हैं "

 virtual void fun()
 {
     //dostuff()
 }

सहज ज्ञान युक्त लगता है कि व्यवहार्य प्रविष्टि या तो कहीं भी (0) या एक फ़ंक्शन के लिए परिभाषित की जा सकती है। आपको इसके लिए अपना स्वयं का मान निर्दिष्ट करने की अनुमति होगी, जिसके परिणामस्वरूप संभवतः यह एक फ़ंक्शन के बजाय कचरा इंगित करेगा। लेकिन इसीलिए "= 0" की अनुमति है और "= 1" नहीं है। मुझे संदेह है कि नील बटरवर्थ सही है कि "= 0" का उपयोग क्यों किया जाता है


1
यहां तक ​​कि मेरी भी ऐसी ही राय थी लेकिन चूंकि कई ने मानकों और बज़्ने की टिप्पणियों को उद्धृत किया है, इसलिए हमारे पास तर्क की न्यूनतम संभावना है :)
मुकेशकुमार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.