2010-02-23 12 views
13

पाठ्यपुस्तक उदाहरणों के अलावा - असली दुनिया में - क्या यह कभी भी एकाधिक विरासत का उपयोग करने के लिए समझ में आता है (जहां बेस क्लास में से एक से अधिक शुद्ध इंटरफेस नहीं हैं) सी ++ में?सी ++ एकाधिक विरासत के असली दुनिया के उदाहरण क्या हैं?

+0

C++ प्रोग्रामिंग के लगभग 20 वर्षों में +1 मेरे पास है * कभी नहीं * एक स्थिति मैं कहाँ की जरूरत * है * एकाधिक inheritence का उपयोग करने के लिए किया गया। – Raedwald

+0

@Raedwald मतलब यह नहीं है कि कि किसी सी ++ काम करता है में कैसे एकाधिक विरासत में पता नहीं करना चाहिए। – anonymous

उत्तर

11

यह बहुत आम है जब Policy-based design का उपयोग कर, उदाहरण के लिए।

+1

वहाँ एक पाठ्यपुस्तक उदाहरण है, लेकिन कुछ भी वास्तविक दुनिया से उद्धृत। – Potatoswatter

4

iostream पर इंगित करना सबसे आसान है, जो istream और ostream से प्राप्त होता है। cin और coutistream और ostream क्रमशः fstreamiostream से निकले हैं।

3

माइक्रोसॉफ्ट के ATL (सक्रिय टेम्पलेट लायब्रेरी) mixin वर्ग के रूप में एकाधिक वंशानुक्रम का उपयोग करता है:

http://en.wikipedia.org/wiki/Active_Template_Library

0

मैंने 'असली दुनिया' में कई विरासत का उपयोग किया है - एक नौकरी में जहां मैं मैपिंग एप्लिकेशन कोडिंग में शामिल था।

दुर्भाग्य से, मुझे सटीक उदाहरण याद नहीं है जो मुझे अविश्वसनीय रूप से निराशाजनक लगता है।

हालांकि, यहां बिंदुओं पर विचार करने के लिए और वैकल्पिक पैटर्न या समाधान के बारे में एक दिलचस्प लेख का उपयोग पर विचार करना है:

http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.2

मैं उदाहरण के लिए वाहनों का उपयोग पसंद है - विशेष रूप से द्विधा गतिवाला वाहन में जोड़ने।

0

एकाधिक विरासत निश्चित रूप से इसकी जगह है और यह बहुत उपयोगी हो सकता है। एक सामान्य दिशानिर्देश के रूप में जब भी संभव हो, एक बेस क्लास अमूर्त होना चाहिए, जिसका अर्थ है कि आप इसे किसी ऑब्जेक्ट को बनाने में सक्षम नहीं होना चाहिए, लेकिन कंक्रीट क्लास से विरासत में आने से आपको कुछ भी नहीं रोकना चाहिए। यह निश्चित रूप से एक योग्यता है कि आप टी कक्षा से वंचित कार्यान्वयन का लाभ उठा सकते हैं। Iostream पर एक जवाब पर उदाहरण एक अच्छा है। एक अन्य उदाहरण एक कर्मचारी जो भी एक मालिक/एक व्यवसाय के निर्देशक है मॉडलिंग कहने के लिए शायद है और आप के रूप में

public class Director 
{ 
    ................ 
    double CalculateDividend(); 
    bool ApproveBudget(); 
}; 

public class Employee 
{ 
    ................ 
    double CalculateSalary(); 
}; 


public class WorkingDirector: Employee, Director 
{ 
    .............. 
}; 

यह मॉडल अब एक WorkingDirector वस्तु क्या एक कर्मचारी और एक निर्देशक जो एक है कर सकते हैं, कर सकते हैं होगा realworld में सही है। हमें किसी भी विधि कार्यान्वयन को ओवरराइट करने की भी आवश्यकता नहीं होगी।

कई मामलों में डिजाइन पैटर्न को लागू करने के लिए कई विरासत समर्थन के साथ भी आसान बना दिया गया है।

+0

यह एक वास्तविक शब्द उदाहरण नहीं है। – Petter

2

आईएमओ, यह तर्क के लिए खुला है। टेम्पलेट्स से पहले, ऐसे उचित मामले थे जो इसे उचित ठहराते थे। असल में, आप बेस क्लास का उपयोग कर सकते हैं जैसे आप टेम्पलेट्स के साथ पॉलिसी क्लासेस का उपयोग कर सकते हैं। आप (कुछ) प्राप्त कर सकते हैं एकाधिक वंशानुक्रम के साथ काफी समान क्षमताओं आप बल्कि किसी कारण से टेम्पलेट का उपयोग नहीं करना चाहते तो

template <typename policy1, typename policy2> 
class whatever { 
    policy1 p1; 
    policy2 p2; 
public: 
    void dosomething() { if (p1.enquire()) p2.dosomething(); } 
}; 

,: उदाहरण के लिए, की तरह एक टेम्पलेट पर विचार

class whatever : policy1, policy2 { 
    void dosomething() { if (enquire()) dosomething(); } 

};

दोनों मामलों में, आप मूल रूप से अपनी नई वस्तु में "नीति" का एक उदाहरण एम्बेड कर रहे हैं।हम निजी वंशानुक्रम का उपयोग कर रहे हैं, वहाँ LSP साथ कोई चिंता नहीं है - बल्कि, यह है - ज्यादा नीति पर आधारित टेम्पलेट के साथ की तरह, आशय एक बड़ी पदानुक्रम कि पदानुक्रम के सदस्यों के बीच संबंधों के बारे में कुछ भी दावा है बनाने के लिए नहीं है बस मांग पर असंबंधित कक्षाओं की एक विशाल विविधता बनाने की क्षमता बनाने के बारे में।

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