2010-03-09 13 views
14

सीलबंद कक्षाओं पर चर्चा करते समय, "वर्चुअल फ़ंक्शन टेबल" शब्द का उल्लेख अक्सर किया जाता है। यह वास्तव में क्या है मैंने कुछ समय पहले एक विधि तालिका के बारे में पढ़ा था (मुझे इसके उद्देश्य के उद्देश्य को याद नहीं है) और यहां पर एक Google/खोज सी ++ संबंधित परिणाम लाती है।वर्चुअल विधि तालिका

धन्यवाद

उत्तर

4

सी # आभासी समारोह तालिका मूल रूप से सी ++ एक के रूप में ही काम करता है, इसलिए किसी भी संसाधनों जो वर्णन कैसे सी ++ आभासी समारोह तालिका काम करता है के साथ सी # एक के रूप में अच्छी तरह से बहुत अच्छी तरह से आप की मदद करनी चाहिए।

उदाहरण के लिए, Wikipedia's description खराब नहीं है।

0

वर्चुअल फ़ंक्शन टेबल (अक्सर कॉलटेबल कॉल) की परिभाषा सी # और सी ++ में समान है। यह सारणी/आभासी/ओवरराइड विधि के बहुलक व्यवहार प्राप्त करने के लिए रनटाइम द्वारा आंतरिक रूप से एक लुकअप टेबल का उपयोग करता है।

सरल में आप वर्चुअल विधि के साथ बेस क्लास की कल्पना कर सकते हैं ए में एक vtable होगा जिसमें methodA होगा। जब क्लास ओवरराइड विधि ए प्राप्त होता है, तो विधि ए के लिए vtable अभिभावक वर्ग से प्राप्त होता है लेकिन अब मूल वर्ग की बजाय व्युत्पन्न कक्षा में विधि ए को इंगित करेगा।

19

"वर्चुअल फ़ंक्शन टेबल" या "वर्चुअल विधि तालिका" प्रत्येक क्लास के विधि पॉइंटर्स की एक सूची है। इसमें कक्षा में आभासी तरीकों के पॉइंटर्स शामिल हैं।

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

आप उदाहरण के लिए एक स्ट्रिंग के लिए एक वस्तु संदर्भ है, तो:

object obj = "asdf"; 

और आभासी विधि ToString फोन:

string text = obj.ToString(); 

यह String.ToString विधि, नहीं वस्तु का प्रयोग करेंगे। ToString विधि। यह स्ट्रिंग क्लास की वर्चुअल विधि तालिका का उपयोग कर रहा है (जो स्ट्रिंग इंस्टेंस में पॉइंटर इंगित कर रहा है), ऑब्जेक्ट क्लास की वर्चुअल विधि तालिका नहीं।

+0

क्या मैं सही ढंग से समझता हूं कि "विधि तालिका" किसी भी प्रकार के अनुसार बनाई गई है। इसलिए मान प्रकार में "विधि तालिका" भी है। और एक और सवाल यह है कि कैसे एक प्रकार को पता चला कि इसमें "विधि तालिका" है? क्या "विधि तालिका" एक प्रकार-ऑब्जेक्ट में संग्रहीत या संदर्भित है? लेकिन मान प्रकार में टाइप-ऑब्जेक्ट पॉइंटर नहीं है। :/यहां एक संबंधित प्रश्न है: http://stackoverflow.com/questions/35185528/does-a-value-type-keep-type-pointer-sync-root-static-fields-like-a-reference/35185851# 35185851 – Spirit

+2

@Spirit: हाँ, हर प्रकार में एक विधि तालिका होती है (कम से कम कुछ रूप में कुछ रूप में)। चूंकि मान प्रकारों के लिए कॉल गैर-आभासी हैं, सटीक विधियों को संकलित समय पर निर्धारित किया जाता है, इसलिए उन्हें वर्चुअल विधि तालिका की आवश्यकता नहीं होती है, उनके लिए केवल प्रतिबिंब उद्देश्यों के लिए निष्पादन योग्य में मौजूद होना आवश्यक होगा। मुझे नहीं पता कि विधि तालिका वास्तव में कहां संग्रहीत की जाती है, यह कार्यान्वयन पर निर्भर करेगा ताकि आप इसके लिए फ्रेमवर्क स्रोत कोड देख सकें (हालांकि कार्यान्वयन का वह हिस्सा सार्वजनिक नहीं हो सकता है)। – Guffa

+0

धन्यवाद। आपका जवाब आपका बहुत स्पष्ट है। मुझे अंत में एक समान एसओ चर्चा मिली है: http://stackoverflow.com/questions/926352/how-is-valuetype-gettype-able-to-determine-the-type-of-the-struct – Spirit

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