मैं निम्नलिखित स्थिति, चित्र मेरी कक्षाओं के सैद्धांतिक विरासत ग्राफ है:इंटरफ़ेस की तरह विरासत
विचार
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 अनुवाद यह सी ++ के अनुकूल है?
संपादित करें: आरेख में उलटा तीर और "डाउन-कास्टेबल" को "अप-कास्टेबल" में सही किया गया।
"बीबीएएस को अबाउट करने के लिए डाउन-कास्टेबल होना चाहिए" का मतलब है आप कास्ट-कास्टेबल, है ना? –
हां, संकेत के लिए धन्यवाद। आरेख में तीरों के लिए भी यही है। – Johannes