2012-01-10 12 views
10

मेरे पास एक आसान आरएआईआई कक्षा है ताकि यह सुनिश्चित किया जा सके कि कुछ हैंडल ठीक तरह से निपटाए गए हैं। अब मैं यह कहना चाहूंगा कि दुर्घटना से कोई भी वर्चुअल तरीकों को जोड़ने वाला नहीं है। जिस तरह से मैं इसे देखता हूं, मुझे यह ज़ोर देना होगा कि कक्षा में vtbl सूचक नहीं है।कैसे जोर दें कि किसी विशेष श्रेणी में उसके लेआउट में कोई vtbl पॉइंटर्स नहीं है?

मैं यह कैसे कर सकता हूं? संकलन समय पर जोर देना संभव है?

संपादित

मैं डेस्कटॉप compilers के लिए समझौता होगा। जहां तक ​​मुझे पता है कि कोई डेस्कटॉप सी ++ कंपाइलर नहीं है जो पॉलीमोर्फिज्म को लागू करने के लिए vtbl का उपयोग नहीं कर रहे हैं।

+0

सैद्धांतिक रूप से, आप इसे पोर्टेबल तरीके से नहीं कर सकते हैं। –

+0

आपको _sealed_ कक्षा प्राप्त करने में रुचि हो सकती है: http://stackoverflow.com/q/4712992/96780 –

+2

vtbl एक कार्यान्वयन विवरण है। एक कंपाइलर मौजूद हो सकता है जो आभासी कार्यों को लागू करने के लिए कॉल टेबल का उपयोग नहीं करता है। क्या आप खुद को एक विशिष्ट कंपाइलर तक सीमित करना चाहते हैं? – filmor

उत्तर

19

आप एक सी ++ 11 लाइब्रेरी है, तो आप std::is_polymorphic<T> उपयोग कर सकते हैं:

हैं टी एक बहुरूपी वर्ग (कि, एक वर्ग है कि वाणी है या कम से कम एक आभासी समारोह विरासत है) है, प्रदान करता है सदस्य स्थिर मूल्य बराबर सच है। किसी अन्य प्रकार के लिए, मूल्य गलत है।

+0

के बीच इंटरऑप के साथ करना है, मुझे इसे मारो, +1। – jrok

+1

+1, अच्छा! इसके अलावा यदि आपके पास C++ 11 नहीं है और आपके पास Visual C++ है तो '__is_polymorphic' है - http://msdn.microsoft.com/en-us/library/ms177194%28v=VS.90%29.aspx – sharptooth

+0

नाइस । काश वे सी ++ 11 में अधिक स्थिर प्रकार की जानकारी/प्रतिबिंब सुविधाओं को प्रस्तुत करते हैं (जैसे कक्षा के लिए फ़ील्ड/विधियों की सूची प्राप्त करने के लिए)। यह स्क्रिप्टिंग भाषाओं के लिए रैपर जैसे कुछ मेटा-कोड बनाने के लिए इतना आसान बना देगा। – Kos

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