सबसे स्पष्ट समस्या फ़ंक्शन ओवरराइडिंग के साथ है।
मान लीजिए कि दो वर्ग हैं A
और B
दोनों एक विधि को परिभाषित करते हैं doSomething
। अब आप किसी तृतीय वर्ग को परिभाषित C
दोनों से है, जो विरासत में मिली A
और B
, लेकिन आप पर हावी नहीं है doSomething
विधि।
जब संकलक बीज इस कोड ...
C c = new C();
c.doSomething();
... विधि के किस कार्यान्वयन का उपयोग करना चाहिए? किसी और स्पष्टीकरण के बिना, कंपाइलर के लिए अस्पष्टता को हल करना असंभव है।
ओवरराइडिंग के अलावा, मल्टीपल इनहेरिटेंस के साथ अन्य बड़ी समस्या मेमोरी में भौतिक वस्तुओं का लेआउट है।
C ++ और Java और C # जैसी भाषाएँ प्रत्येक प्रकार की ऑब्जेक्ट के लिए एक निश्चित एड्रेस-बेस्ड लेआउट बनाती हैं। कुछ इस तरह:
class A:
at offset 0 ... "abc" ... 4 byte int field
at offset 4 ... "xyz" ... 8 byte double field
at offset 12 ... "speak" ... 4 byte function pointer
class B:
at offset 0 ... "foo" ... 2 byte short field
at offset 2 ... 2 bytes of alignment padding
at offset 4 ... "bar" ... 4 byte array pointer
at offset 8 ... "baz" ... 4 byte function pointer
जब कंपाइलर मशीन कोड (या बायटेकोड) उत्पन्न करता है, तो यह प्रत्येक विधि या क्षेत्र तक पहुंचने के लिए उन संख्यात्मक ऑफसेट का उपयोग करता है।
एकाधिक वंशानुक्रम इसे बहुत मुश्किल बना देता है।
वर्ग तो C
दोनों से विरासत में मिली A
और B
, संकलक में डेटा लेआउट तय करना पड़ता है AB
आदेश या में BA
आदेश।
लेकिन अब कल्पना कीजिए कि आप किसी B
ऑब्जेक्ट पर कॉल कर रहे हैं । क्या यह वास्तव में सिर्फ एक है B
? या यह वास्तव में एक C
वस्तु है जिसे इसके B
इंटरफ़ेस के माध्यम से बहुरूपिए कहा जा रहा है? ऑब्जेक्ट की वास्तविक पहचान के आधार पर, भौतिक लेआउट अलग होगा, और कॉल-साइट पर आह्वान करने के लिए फ़ंक्शन की ऑफसेट को जानना असंभव है।
इस तरह की प्रणाली को संभालने का तरीका फिक्स्ड-लेआउट दृष्टिकोण को खोदना है, जिससे प्रत्येक वस्तु को उसके लेआउट के लिए पहले से क्वेरर किया जा सके। फ़ंक्शन को लागू करने या अपने खेतों तक पहुंचने लिए क्वियर किया जा सके।
तो ... लंबी कहानी छोटी ... यह कई लेखकों के लिए गर्दन में दर्द है जो कई विरासत का समर्थन करता है। इसलिए जब कोई गुइडो वैन रोसुम अजगर की तरह डिजाइन करता है, या जब एंडर्स हेजलबर्ग सी # डिजाइन करते हैं, तो वे जानते हैं कि कई विरासत का समर्थन करने से कंपाइलर कार्यान्वयन काफी जटिल हो जाता है, और संभवतः उन्हें नहीं लगता कि लाभ लागत के लायक है।