2011-01-08 19 views
6

मैं निम्नलिखित स्थिति, चित्र मेरी कक्षाओं के सैद्धांतिक विरासत ग्राफ है:इंटरफ़ेस की तरह विरासत

Inheritance Graph

विचार

1) दो सार आधार वर्ग के लिए मूल रूप से है जिसे विभिन्न प्लेटफॉर्म पर लागू किया जा सकता है (मेरे मामले में दो अलग-अलग ऑपरेटिंग सिस्टम)

2) बीबीएस को समान रूप से दोनों को संभालने में सक्षम होने के लिए अपरिवर्तनीय होने की अनुमति दें (उदाहरण के लिए दोनों प्रकार के उदाहरणों को पकड़ना एक सूची में)।

3) ABase और BBase में कुछ सामान्य कार्यक्षमता को लागू करें।

अब, सी ++ में इसका प्रतिनिधित्व करने का सबसे अच्छा तरीका क्या होगा? भले ही यह एकाधिक विरासत का समर्थन करता है, इस तरह बहु-स्तर की विरासत मेरे ज्ञान के लिए संभव नहीं है। समस्या यह है कि बी ए और बीबीएस से विरासत में मिलता है, जो बदले में एबेस से प्राप्त होता है। सी ++, एक सी ++ संकलक (जीएनयू) में 1 (निम्नलिखित कोड) कि अपमानित करना :: foo शिकायत() बी

class ABase 
{ 
public: 
    virtual void foo() = 0; 
    void someImplementedMethod() {} 
}; 

class BBase : public ABase 
{ 
public: 
    virtual void bar() = 0; 
    void someOtherImplementedMethod() {} 
}; 

class A : public ABase 
{ 
public: 
    A() {} 
    void foo() {} 
}; 

class B : public A, public BBase 
{ 
public: 
    B() : A() {} 
    void bar() {} 
}; 

int main() 
{ 
    B b; 
    return 0; 
} 

में लागू नहीं है तुम कैसे बनाने के लिए इस विरासत मॉडल बदल जाएगा: बस यह 1 अनुवाद यह सी ++ के अनुकूल है?

संपादित करें: आरेख में उलटा तीर और "डाउन-कास्टेबल" को "अप-कास्टेबल" में सही किया गया।

+0

"बीबीएएस को अबाउट करने के लिए डाउन-कास्टेबल होना चाहिए" का मतलब है आप कास्ट-कास्टेबल, है ना? –

+0

हां, संकेत के लिए धन्यवाद। आरेख में तीरों के लिए भी यही है। – Johannes

उत्तर

7

आप सीधे virtual inheritance का उपयोग करके C++ पदानुक्रम के उस प्रकार का उपयोग कर सकते हैं:

class ABase{...}; 
class BBase : public virtual ABase {...}; 
class A  : public virtual ABase {...}; 
class B  : public A, public BBase {...}; 
बेशक

अगर आप की योजना अधिक स्तर होने पर, यह भी बी के लिए आभासी विरासत उपयोग करने के लिए एक अच्छा विचार हो सकता है, इसलिए आपको

class B  : public virtual A, public virtual BBase {...}; 
+0

'बीबीएसई' के लिए 'आभासी' का उपयोग करने के बारे में अच्छी टिप्पणी भी। यह तय करना अच्छा होता है कि इस तरह के हीरे में कौन से वर्ग इंटरफेस हैं और इसलिए जहां 'आभासी' तार्किक रूप से सही है। –

+0

वाह, आपका जवाब तेज तेज हो गया! बहुत बहुत धन्यवाद, वर्चुअल विरासत बिल्कुल वही है जो मुझे चाहिए! – Johannes

+0

यद्यपि 'कक्षा ए' सख्ती से कार्यान्वयन वर्ग है, फिर भी इसे 'आभासी' आधार होने की आवश्यकता नहीं है। –

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