मेरे पास एक सार आधार वर्ग है जो एक इंटरफ़ेस के रूप में कार्य करता है।दो व्युत्पन्न कक्षाओं से एकाधिक विरासत
मेरे पास व्युत्पन्न कक्षाओं के दो "सेट" हैं, जो अमूर्त वर्ग के आधे हिस्से को लागू करते हैं। (एक "सेट" प्रारंभिक से संबंधित अमूर्त वर्चुअल विधियों को परिभाषित करता है, अन्य "सेट" वास्तविक "काम" से संबंधित लोगों को परिभाषित करता है।)
तब मैंने कक्षाएं ली हैं जो पूरी तरह परिभाषित कक्षाओं (और कुछ भी खुद को जोड़ता नहीं है)।
तो: (बुरा स्यूडोकोड)
class AbsBase {
virtual void init() = 0;
virtual void work() = 0;
}
class AbsInit : public AbsBase {
void init() { do_this(); }
// work() still abs
}
class AbsWork : public AbsBase {
void work() { do_this(); }
// init() still abs
}
class NotAbsTotal : public AbsInit, public AbsWork {
// Nothing, both should be defined
}
सबसे पहले, मैं यह कर सकता है? क्या मैं दो वर्गों से प्राप्त कर सकता हूं जो दोनों एक ही आधार से व्युत्पन्न हैं? (मुझे ऐसी ही उम्मीद है)।
यहां "असली समस्या" है, हालांकि (मैंने उदाहरण को सरल बनाने के लिए थोड़ा ऊपर झूठ बोला)।
class AbsBase {
public:
void init() { init_impl(); }
void work() { work_impl(); }
private:
virtual void init_impl() = 0;
virtual void work_impl() = 0;
}
वजह से, एक आम मुहावरा सभी आभासी तरीकों निजी बनाने के लिए है:
क्या मैं सच में चला गया और किया है आधार वर्ग के लिए गैर सार accessors विधियों को जोड़ने है।
दुर्भाग्यवश, अब अब AbsInit, और AbsWork दोनों इन तरीकों का उत्तराधिकारी हैं, और इसलिए NotAbsTotal को "प्रत्येक में से दो" प्राप्त होता है (मुझे एहसास है कि मैं संकलन समय पर वास्तव में क्या हो रहा है)।
वैसे भी, g ++ शिकायत करता है कि: "वर्ग का उपयोग करने का प्रयास करते समय सदस्य init() अस्पष्ट है"।
मुझे लगता है कि, मैंने अपने एब्सबेस वर्ग को शुद्ध इंटरफ़ेस के रूप में उपयोग किया था, यह टालना होगा (माना जाता है कि शीर्ष उदाहरण मान्य है)।
तो: - क्या मैं अपने कार्यान्वयन के साथ बंद हूं? - क्या यह आभासी तरीकों को निजी बनाने के मुहावरे की सीमा है? - मैं जो चाहता हूं उसे करने के लिए अपने कोड को दोबारा कैसे दोहरा सकता हूं? (एक आम इंटरफ़ेस एक तरह से सदस्य कार्यों के "सेट" के लिए कार्यान्वयन बाहर स्वैप करने के लिए प्रदान करें, लेकिन अनुमति देते हैं)
संपादित करें:
लगता है मैं पहले एक नहीं कर रहा हूँ: http://en.wikipedia.org/wiki/Diamond_problem
लगता आभासी विरासत है यहां समाधान मैंने पहले आभासी विरासत के बारे में सुना है, लेकिन मैंने इसके चारों ओर अपना सिर लपेटा नहीं है। मैं अभी भी सुझावों के लिए खुला हूं।
आप ऐसा क्यों कहते हैं? आभासी विरासत की वाक्यविन्यास जटिलता के अलावा, क्या प्रभाव हैं? – mmocny
किसी व्युत्पन्न कक्षा में आधार सूचक का रूपांतरण आमतौर पर गतिशील लुकअप तालिका का उपयोग करके सूचक समायोजन शामिल करता है। यह अतिरिक्त संकेतक आधार से व्युत्पन्न करने की लागत को प्रस्तुत करता है। वर्चुअल विधि को कॉल करते समय, यह ओवरहेड कॉल के शोर में होता है। –