8

मैं "सी ++ ऑब्जेक्ट मॉडल के अंदर" पढ़ रहा हूं, यह समझने की कोशिश कर रहा हूं कि vtables के माध्यम से कितने और आभासी विरासत को हासिल किया जाता है। (मैं एकल polymorphism पूरी तरह से अच्छी तरह से समझता हूं)।एकाधिक या आभासी विरासत और vtable (ओं) के तहत कक्षा के मेमोरी लेआउट?

मुझे कठिनाइयों का सामना करना पड़ रहा है कि वर्चुअल विरासत के दौरान या कास्टिंग के दौरान एक विधि की आवश्यकता होने पर वास्तव में क्या किया जाता है, क्योंकि ऑफसेट गणना करने के लिए बहुत सी चीजें होती हैं।

क्या कोई यह समझने में सहायता कर सकता है कि एकाधिक या वर्चुअल विरासत उदाहरण में एकाधिक vtables का उपयोग कैसे किया जाता है? अगर मैं लेआउट और समस्या को समझ सकता हूं, तो शायद मैं इस मुद्दे को बेहतर ढंग से समझ सकता हूं।

+0

जब आप एकाधिक विरासत कहते हैं, तो क्या आपका मतलब है कि लगातार घर्षण (सी से विरासत में से विरासत प्राप्त होती है) या क्या आपका वास्तविक बहु विरासत (सी एक साथ बी विरासत में मिलता है)? – Christophe

+0

शायद यह प्रश्न http://stackoverflow.com/q/11603198/1741542 में सहायता करता है –

उत्तर

10

सी ++ कार्यान्वयन आमतौर पर आभासी कार्यों को लागू करने के लिए vtables का उपयोग करते हैं। एक vtable कार्यों के लिए पॉइंटर्स की एक तालिका है। वर्चुअल फ़ंक्शंस वाले क्लास के प्रत्येक ऑब्जेक्ट में कक्षा के सभी वर्चुअल फ़ंक्शंस के पते वाले vtable के लिए एक छुपा पॉइंटर होता है।

वर्चुअल फ़ंक्शन का आविष्कार करते समय, कोड vtable में फ़ंक्शन पॉइंटर के ऑफ़सेट की गणना करता है, और उस फ़ंक्शन को कॉल करता है जहां पता संग्रहीत किया जाता है।

enter image description here

आधार वर्ग के एक व्युत्पन्न वर्ग एक virtuall समारोह overides है, उस वर्ग के आभासी मेज सिर्फ overidden समारोह के बजाय मूल एक के लिए अंक।

यह excellent article explains विवरण में यह एकल और एकाधिक विरासत दोनों के लिए कैसे काम करता है।

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