सदस्य : लॉगिन |पंजीकरण |अपलोड ज्ञान
खोज
वर्चुअल विधि तालिका
1.कार्यान्वयन
2.उदाहरण
3.एकाधिक विरासत और thunks
4.मंगलाचरण [संशोधन ]
डी-> एफ 1 () को कॉल करने के लिए डीईआर डी :: बी 1 vpointer dereferencing द्वारा संभाला जाता है, vtable में f1 प्रविष्टि को देखता है, और उसके बाद कोड को कॉल करने के लिए पॉइंटर को संदर्भित करता है।
एकल विरासत (या केवल एक विरासत वाली भाषा में) के मामले में, यदि vpointer हमेशा डी में पहला तत्व होता है (जैसा कि यह कई कंपाइलर्स के साथ है), यह निम्न छद्म-सी को कम कर देता है:


(* ((* घ))) (डी)

जहां * डी डी की आभासी विधि तालिका को संदर्भित करता है और vtable में पहली विधि को संदर्भित करता है। पैरामीटर डी ऑब्जेक्ट में "यह" पॉइंटर बन जाता है।
अधिक सामान्य मामले में, बी 1 :: एफ 1 () या डी :: एफ 2 () को कॉल करना अधिक जटिल है:


(* (* (डी [0] / * डी की वर्चुअल विधि तालिका के लिए सूचक (बी 1 के लिए) * /)) (डी) / * कॉल डी-> एफ 1 () * /
(* (* (डी [8] / * डी (वर्चुअल विधि तालिका) के लिए सूचक (बी 2 के लिए) * /)) (डी 8) / * कॉल डी-> एफ 2 () * /

डी-> एफ 1 () को कॉल पैरामीटर के रूप में बी 1 पॉइंटर पास करता है। डी-> f2 () को कॉल पैरामीटर के रूप में बी 2 पॉइंटर पास करता है। इस दूसरे कॉल को सही सूचक बनाने के लिए एक फिक्सअप की आवश्यकता है। बी 2 :: एफ 2 का स्थान डी के लिए vtable में नहीं है।
तुलनात्मक रूप से, डी-> f0 () को कॉल करना बहुत आसान है:


(* बी 1 :: f0) (डी)
5.दक्षता
6.विकल्पों के साथ तुलना
[अपलोड अधिक अंतर्वस्तु ]


सर्वाधिकार @2018 Lxjkh