यदि कोई गतिशील प्रेषण (बहुरूपता) नहीं है, तो "विधियाँ" केवल शर्करा कार्य हैं, शायद एक अतिरिक्त पैरामीटर के साथ। तदनुसार, बिना पॉलिमॉर्फिक व्यवहार वाले वर्गों के उदाहरण अनिवार्य रूप struct
से कोड पीढ़ी के उद्देश्य के लिए हैं।
एक स्थिर प्रकार प्रणाली में शास्त्रीय गतिशील प्रेषण के लिए, मूल रूप से एक प्रमुख रणनीति है: vtables। प्रत्येक उदाहरण को एक अतिरिक्त पॉइंटर मिलता है जो संदर्भित करता है (इसका सीमित प्रतिनिधित्व) इसके प्रकार, सबसे महत्वपूर्ण रूप से व्यवहार्य: फ़ंक्शन पॉइंट की एक सरणी, प्रति विधि। चूंकि प्रत्येक प्रकार (विरासत श्रृंखला में) के लिए विधियों का पूरा सेट संकलन समय पर जाना जाता है, कोई भी तरीकों के लिए लगातार सूचक (N तरीकों के लिए 0..N) असाइन कर सकता है और फ़ंक्शन पॉइंटर को देखकर विधियों को लागू कर सकता है इस सूचकांक (फिर अतिरिक्त पैरामीटर के रूप में इंस्टेंस संदर्भ को पास करते हुए) का उपयोग करते हुए व्यवहार्य।
अधिक गतिशील वर्ग-आधारित भाषाओं के लिए, आमतौर पर कक्षाएं स्वयं प्रथम श्रेणी की वस्तुएं होती हैं और प्रत्येक वस्तु की बजाय इसके वर्ग वस्तु का संदर्भ होता है। क्लास ऑब्जेक्ट, बदले में, कुछ भाषा-निर्भर तरीके से तरीकों का मालिक है (रूबी में, विधियां ऑब्जेक्ट मॉडल का एक मुख्य हिस्सा हैं, पायथन में वे सिर्फ उनके चारों ओर छोटे रैपर के साथ ऑब्जेक्ट फ़ंक्शन करते हैं)। कक्षाएं आम तौर पर उनके सुपरक्लास (एस) के संदर्भों को संग्रहीत करती हैं, और उन वर्गों के लिए विरासत में मिली विधियों की खोज को निर्धारित करती हैं, जो मेटाप्रोग्रामिंग में सहायता करती हैं जो तरीकों को जोड़ता है और बदल देता है।
कई अन्य प्रणालियां हैं जो कक्षाओं पर आधारित नहीं हैं, लेकिन वे काफी भिन्न हैं, इसलिए मैं केवल एक दिलचस्प डिज़ाइन विकल्प चुनूंगा: जब आप प्रोग्राम में कहीं भी सभी प्रकार के नए (सेट) तरीकों को जोड़ सकते हैं ( जैसे हास्केल में कक्षाएं टाइप करें और रस्ट में लक्षण), संकलन करते समय तरीकों का पूरा सेट ज्ञात नहीं है। इसे हल करने के लिए, व्यक्ति प्रति विशेषता को एक व्यवहार्य बनाता है और जब विशेषता के कार्यान्वयन की आवश्यकता होती है, तो उन्हें चारों ओर से गुजरता है। यह है, इस तरह कोड:
void needs_a_trait(SomeTrait &x) { x.method2(1); }
ConcreteType x = ...;
needs_a_trait(x);
इसे नीचे संकलित किया गया है:
functionpointer SomeTrait_ConcreteType_vtable[] = { &method1, &method2, ... };
void needs_a_trait(void *x, functionpointer vtable[]) { vtable[1](x, 1); }
ConcreteType x = ...;
needs_a_trait(x, SomeTrait_ConcreteType_vtable);
इसका मतलब यह भी है कि vtable जानकारी ऑब्जेक्ट में एम्बेडेड नहीं है। यदि आप एक "उदाहरण की विशेषता" के संदर्भ चाहते हैं जो कि सही ढंग से व्यवहार करेगा, उदाहरण के लिए, डेटा संरचनाओं में संग्रहीत जिसमें कई अलग-अलग प्रकार होते हैं, तो एक वसा सूचक बना सकता है (instance_pointer, trait_vtable)
। यह वास्तव में उपरोक्त रणनीति का एक सामान्यीकरण है।