C ++ में एक वर्ग एक से अधिक वर्गों से उत्तराधिकार (प्रत्यक्ष या अप्रत्यक्ष रूप से) ले सकता है, जिसे एकाधिक उत्तराधिकार के रूप में संदर्भित किया जाता है
।
हालाँकि, C # और Java, कक्षाओं को एकल वंशानुक्रम तक सीमित करते हैं, प्रत्येक वर्ग को एकल पैरेंट क्लास से विरासत में मिला है।
एकाधिक वंशानुक्रम उन वर्गों को बनाने के लिए एक उपयोगी तरीका है जो दो असमान वर्ग पदानुक्रमों के पहलुओं को मिलाते हैं, कुछ ऐसा जो अक्सर एक ही आवेदन के भीतर विभिन्न वर्ग रूपरेखाओं का उपयोग करते समय होता है।
यदि दो फ्रेमवर्क अपवादों के लिए अपने स्वयं के आधार वर्गों को परिभाषित करते हैं, उदाहरण के लिए, आप अपवाद वर्गों को बनाने के लिए कई विरासत का उपयोग कर सकते हैं जो या तो फ्रेमवर्क के साथ उपयोग किए जा सकते हैं।
मल्टीपल इनहेरिटेंस के साथ समस्या यह है कि इससे अस्पष्टता हो सकती है। क्लासिक उदाहरण है जब एक वर्ग दो अन्य वर्गों से विरासत में मिला है, जिनमें से प्रत्येक एक ही वर्ग से विरासत में मिला है:
class A {
protected:
bool flag;
};
class B : public A {};
class C : public A {};
class D : public B, public C {
public:
void setFlag( bool nflag ){
flag = nflag; // ambiguous
}
};
इस उदाहरण में, flag
डेटा सदस्य द्वारा परिभाषित किया गया है class A
। लेकिन class D
से उतरता है class B
और class C
, जो दोनों प्राप्त से A
, संक्षेप में इतना दो प्रतियां की flag
वजह से दो उदाहरणों से उपलब्ध हैं A
में हैं D
के वर्ग पदानुक्रम। आप कौन सा सेट करना चाहते हैं? संकलक शिकायत है कि के संदर्भ flag
में D
है अस्पष्ट । एक फिक्स संदर्भ को स्पष्ट रूप से खारिज करना है:
B::flag = nflag;
एक और फिक्स है बी और सी को घोषित करना virtual base classes
, जिसका अर्थ है कि ए की केवल एक प्रति पदानुक्रम में मौजूद हो सकती है, किसी भी अस्पष्टता को समाप्त कर सकती है।
अन्य जटिलताएं कई वंशानुक्रम के साथ मौजूद होती हैं, जैसे कि एक व्युत्पन्न वस्तु का निर्माण होने पर आधार कक्षाएं आरम्भ होती हैं, या जिस तरह से सदस्यों को अनजाने में व्युत्पन्न वर्गों से छिपाया जा सकता है। इन जटिलताओं से बचने के लिए, कुछ भाषाओं ने खुद को सरल एकल विरासत मॉडल तक सीमित कर लिया।
यद्यपि यह वंशानुक्रम को काफी सरल करता है, यह इसकी उपयोगिता को भी सीमित करता है क्योंकि केवल एक सामान्य पूर्वज के साथ कक्षाएं व्यवहार साझा कर सकती हैं। इंटरफ़ेसेस इस प्रतिबंध को कुछ हद तक अलग-अलग पदानुक्रमों में वर्गों को साझा करने की अनुमति देकर, भले ही वे साझाकरण कोड के साथ लागू नहीं किए गए हों।