2010-04-07 12 views

उत्तर

-2

हां। यदि आप कहते हैं:

virtual void foo() = 0; 

यह लगभग सचमुच vtable में एक प्रविष्टि के लिए 0 से एक काम है। इसे भी सचमुच मत लें लेकिन यह याद रखने का एक अच्छा तरीका है कि इसका क्या अर्थ है।

+4

यह लगभग निश्चित रूप से नहीं है। Http://stackoverflow.com/questions/2156634/why-pure-virtual-function-is-initialized-by-0 –

+2

ओह, लड़का, आपने इसे शाब्दिक रूप से लिया। ;) –

16

सबसे पहले, vtables का उपयोग कार्यान्वयन परिभाषित किया गया है और मानक द्वारा अनिवार्य नहीं है।

vtable का उपयोग करने वाले कार्यान्वयन के लिए, जवाब है: हां, आमतौर पर। आपको लगता है कि सार वर्गों के लिए vtable की आवश्यकता नहीं है क्योंकि व्युत्पन्न वर्ग का अपना स्वयं का vtable होगा, लेकिन निर्माण के दौरान इसकी आवश्यकता होती है: जबकि बेस क्लास का निर्माण किया जा रहा है, यह vtable पॉइंटर को अपने स्वयं के vtable पर सेट करता है। बाद में जब व्युत्पन्न वर्ग कन्स्ट्रक्टर दर्ज किया गया है, तो यह इसके बजाय अपने स्वयं के vtable का उपयोग करेगा।

उसने कहा, कुछ मामलों में इसकी आवश्यकता नहीं है और vtable को अनुकूलित किया जा सकता है। उदाहरण के लिए, एमएस विजुअल सी ++ शुद्ध इंटरफ़ेस कक्षाओं पर vtable पीढ़ी को अक्षम करने के लिए __declspec(novtable) ध्वज प्रदान करता है।

-6

हमारे पास कक्षा के लिए वर्चुअल टेबल है जिसमें कम से कम एक वर्चुअल फ़ंक्शन है। कि वर्चुअल फ़ंक्शन भी शुद्ध हो सकता है। इसका मतलब है। एक अबाध वर्ग एक vtable हो सकता है।

अस्थिर कक्षाओं के मामले में vtable प्रविष्टि शून्य होगी। जब भी आप एक अमूर्त वर्ग को तुरंत चालू करने का प्रयास करते हैं तो यह था vtable में जांच करेगा और एक पूर्ण मान की जांच मौजूद है या नहीं। यदि न्यूल मौजूद है तो संकलक एक त्रुटि फेंक देगा।

+3

मुझे संदेह है कि एक कंपाइलर मौजूद है, जिसके लिए आप जो कहते हैं वह वास्तव में सच है। –

+0

वाह ... और फिर संकलक आपको एक अच्छा रात का खाना पकाएगा और इसे खत्म करने के बाद आपको मार देगा। –

2

यहां एक आम गलत धारणा प्रतीत होती है, और मुझे लगता है कि इसके स्रोतों का निशान अभी भी ऑनलाइन पाया जा सकता है। Paul DiLascia wrote कुछ समय 2000 में कि -

... देखते हैं कि संकलक अभी भी एक vtable सभी जिसका प्रविष्टियों शून्य कर रहे हैं और अभी भी निर्माता या एक के लिए नाशक में vtable प्रारंभ करने में कोड उत्पन्न की उत्पन्न करता है

वास्तव में यह सच हो सकता है, लेकिन निश्चित रूप से अब नहीं है।

हां, अमूर्त कक्षाओं में शुद्ध सार तत्वों के साथ vtables भी हैं (इन्हें वास्तव में कार्यान्वित और बुलाया जा सकता है), और हाँ - उनका कन्स्ट्रक्टर शुद्ध प्रविष्टियों को निर्दिष्ट मान पर प्रारंभ करता है। कम से कम वीसी ++ के लिए, यह मान सीआरटी फ़ंक्शन _purecall के पते पर है। आप वास्तव में उस मान को नियंत्रित कर सकते हैं, या तो overloading purecall yourself या using _set_purecall_handler द्वारा।

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