2010-01-27 18 views
47

मैं सी ++ सीख रहा हूं, लेकिन मैं अमूर्त वर्ग और ठोस वर्ग के बारे में उलझन में हूं। कुछ असली दुनिया के उदाहरणों की सराहना की जाएगी।एक ठोस वर्ग और एक अमूर्त वर्ग के बीच क्या अंतर है?

+0

सामान्य व्युत्पन्न वर्ग और ठोस कक्षा के बीच क्या अंतर है? –

उत्तर

88

एक अमूर्त वर्ग एक वर्ग है जिसके लिए एक या अधिक विधियों को घोषित किया गया है लेकिन परिभाषित नहीं किया गया है, जिसका अर्थ है कि संकलक जानता है कि ये विधियां कक्षा का हिस्सा हैं, लेकिन उस विधि के लिए कौन सा कोड निष्पादित नहीं किया गया है। इन्हें अमूर्त तरीकों कहा जाता है। यहां एक अमूर्त वर्ग का एक उदाहरण दिया गया है।

class shape { 
public: 
    virtual void draw() = 0; 
}; 

यह एक अमूर्त वर्ग जो यह बताता है कि वर्ग के किसी भी वंश ड्रा विधि को लागू करना चाहिए अगर वर्ग ठोस हो रहा है की घोषणा की। आप इस वर्ग को तत्काल नहीं कर सकते क्योंकि यह सार है, आखिरकार, कंपाइलर को पता नहीं होगा कि अगर आप सदस्य ड्रा कहते हैं तो कौन सा कोड निष्पादित करना है।

shape my_shape(); 
my_shape.draw(); 

वास्तव में ड्रॉ विधि आप इस सार वर्ग है, जो ड्रॉ विधि को लागू करना से कक्षाएं प्राप्त करने की आवश्यकता होगी उपयोग करने में सक्षम होने के लिए, वर्गों ठोस बनाने:: तो आप निम्नलिखित नहीं कर सकते

class circle : public shape { 
public: 
    circle(int x, int y, int radius) { 
    /* set up the circle */ 
    } 
    virtual draw() { 
    /* do stuff to draw the circle */ 
    } 
}; 

class rectangle : public shape { 
public: 
    rectangle(int min_x, int min_y, int max_x, int max_y) { 
    /* set up rectangle */ 
    } 
    virtual draw() { 
    /* do stuff to draw the rectangle */ 
    } 
}; 

अब आप ठोस वस्तुओं चक्र और आयत का दृष्टांत और उनके ड्रॉ तरीकों का उपयोग कर सकते हैं:

circle my_circle(40, 30, 10); 
rectangle my_rectangle(20, 10, 50, 15); 
my_circle.draw(); 
my_rectangle.draw(); 

अब जाहिर है सवाल यह है कि, तुम क्यों w होगा ऐसा करने के लिए चींटी? क्या आपने सर्कल और आयत वर्गों को भी परिभाषित नहीं किया है और पूरे आकार वर्ग से दूर किया है? आप कर सकते थे, लेकिन फिर आप अपने विरासत का लाभ लेने के लिए सक्षम नहीं होगा:

std::vector<shape*> my_scene; 
my_scene.push_back(new circle(40, 30, 10)); 
my_scene.push_back(new rectangle(20, 10, 50, 15)); 
std::for_each(my_scene.begin(), my_scene.end(), std::mem_fun_ref(&shape::draw) 

इस कोड को आइए आप एक कंटेनर में अपने सभी आकृति एकत्रित करते हैं। यदि आपके दृश्य में बहुत सारे आकार और कई अलग-अलग आकार हैं तो इससे यह बहुत आसान हो जाता है। उदाहरण के लिए हम अब सभी आकारों को एक बार में आकर्षित कर सकते हैं, और ऐसा कोड जो हमारे पास विभिन्न प्रकार के आकारों के बारे में जानने की आवश्यकता नहीं है।

अब अंत में हम जानना चाहते हैं क्यों आकार के ड्रा समारोह सार है, और न सिर्फ एक खाली समारोह, यानी कारण है कि हम सिर्फ परिभाषित नहीं किया की जरूरत है:

class shape { 
public: 
    virtual void draw() { 
    /* do nothing */ 
    } 
}; 

इस का कारण यह है कि हम डॉन वास्तव में प्रकार के आकार की वस्तुओं को नहीं चाहते हैं, वैसे भी वे असली चीजें नहीं होंगे, वे अमूर्त होंगे। तो यह ड्रॉ विधि के लिए कार्यान्वयन को परिभाषित करने के लिए कोई समझ नहीं आता है, यहां तक ​​कि एक खाली भी। आकृति वर्ग सार बनाना हमें आकृति वर्ग को गलती से, या गलती से कक्षाओं के ड्रा फंक्शन के बजाय बेस क्लास के खाली ड्रा फ़ंक्शन को कॉल करने से रोकता है। असल में हम किसी भी वर्ग के लिए एक इंटरफ़ेस परिभाषित करते हैं जो एक आकार की तरह व्यवहार करना चाहते हैं, हम कहते हैं कि ऐसी किसी भी श्रेणी में एक ड्रा विधि होनी चाहिए जो ऐसा लगता है कि हमने इसे निर्दिष्ट किया है।

अंतिम प्रश्न का उत्तर देने के लिए, 'सामान्य व्युत्पन्न वर्ग' जैसी कोई भी चीज़ नहीं है, प्रत्येक वर्ग या तो सार या ठोस है।एक वर्ग जिसमें कोई सार तत्व है, सार है, कोई भी वर्ग जो ठोस नहीं है। यह दो प्रकार के वर्गों को अलग करने का एक तरीका है। एक बेस क्लास या तो अमूर्त या ठोस हो सकता है और व्युत्पन्न वर्ग या तो अमूर्त या ठोस हो सकता है:

class abstract_base { 
public: 
    virtual void abstract_method1() = 0; 
    virtual void abstract_method2() = 0; 
}; 

class concrete_base { 
public: 
    void concrete_method1() { 
    /* do something */ 
    } 
}; 

class abstract_derived1 : public abstract_base { 
public: 
    virtual void abstract_method3() = 0; 
}; 

class abstract_derived2 : public concrete_base { 
public: 
    virtual void abstract_method3() = 0; 
}; 

class abstract_derived3 : public abstract_base { 
public: 
    virtual abstract_method1() { 
    /* do something */ 
    } 
    /* note that we do not provide an implementation for 
    abstract_method2 so the class is still abstract */ 
}; 

class concrete_derived1 : public concrete_base { 
public: 
    void concrete_method2() { 
    /* do something */ 
    } 
}; 

class concrete_derived2 : public abstract_base { 
public: 
    virtual void abstract_method1() { 
    /* do something */ 
    } 
    virtual void abstract_method2() { 
    /* do something */ 
    } 
    /* This class is now concrete because no abstract methods remain */ 
}; 
+7

महान स्पष्टीकरण ..! –

+0

यदि किसी फ़ंक्शन की परिभाषा गुम है, तो यह केवल एक लिंक त्रुटि है। एक अमूर्त वर्ग में = 0 शामिल हैं, जैसा कि अन्य उत्तरों ने कहा है। इससे भी बदतर, एक शुद्ध वर्चुअल फ़ंक्शन * सी ++ में परिभाषित किया जा सकता है। दरअसल, परिभाषित लेकिन शुद्ध आभासी विनाशक आम हैं। –

+0

सरल अभी तक नुक्कड़ और कोने को कवर करता है –

3

एक ठोस वर्ग को तत्काल नहीं किया जा सकता है जबकि एक ठोस व्यक्ति कर सकता है। एक अमूर्त वर्ग व्युत्पन्न कक्षाओं के लिए "ब्लूप्रिंट" के रूप में कार्य करता है, जिन्हें तत्काल किया जा सकता है।

उदा। Car कक्षा (सार) जबकि Audi S4 वर्ग (Car से प्राप्त) कक्षा एक ठोस कार्यान्वयन है।

+0

मैं अमूर्त वर्ग के साथ स्पष्ट हूं, लेकिन सामान्य व्युत्पन्न वर्ग और ठोस कक्षा के बीच क्या अंतर है? –

18

एक ठोस वर्ग एक वर्ग है जिसका उपयोग ऑब्जेक्ट बनाने के लिए किया जा सकता है। किसी ऑब्जेक्ट को बनाने के लिए एक अमूर्त वर्ग का उपयोग नहीं किया जा सकता है (आपको एक अमूर्त वर्ग का विस्तार करना होगा और फिर एक ऑब्जेक्ट बनाने में सक्षम होने के लिए एक ठोस वर्ग बनाना होगा)।

दिखाओ कि ऐसी मशीन है जो कच्चे माल को "मुद्रित" कर सकती है और कार बनाती है। स्टैपर एक ठोस वर्ग है। इससे हम कार वस्तुओं को बना सकते हैं। स्टैपर के लिए एक अमूर्त वर्ग ब्लूप्रिंट होगा। आप स्टैपर के ब्लूप्रिंट से कार नहीं बना सकते हैं, आपको पहले ब्लूप्रिंट से स्टैमर क्लास बनाना होगा।

+0

हम इसे ठोस वर्ग क्यों कहते हैं? –

+7

परिभाषा के कारण: कंक्रीट "वास्तविकता में या वास्तविक अनुभव में मौजूद है; इंद्रियों से अवधारणात्मक; असली", जबकि अमूर्त अर्थ "लागू नहीं है या व्यावहारिक; सैद्धांतिक" –

0

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

+0

यह अमूर्त और ठोस वर्गों के बीच अंतर को समझाता नहीं है, बस जब आप एक का उपयोग करेंगे। – wich

+1

अन्य लोगों ने उचित स्पष्टीकरण दिए, मैंने एक वास्तविक उदाहरण दिया। –

0

C++ Faq Lite एक उत्कृष्ट साइट को इस पर जवाब के लिए देखने के लिए है प्रश्नों का प्रकार

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

एक सार कक्षा एक वर्ग है जिसमें एक या अधिक शुद्ध आभासी सदस्य कार्य हैं। तुम एक सार कक्षा की एक वस्तु (उदाहरण) नहीं बना सकते

class Shape { 
public: 
    virtual void draw() const = 0; // = 0 means it is "pure virtual" 
    ... 
}; 
+0

यह अमूर्त और ठोस कक्षाओं के बीच के अंतर को समझाता नहीं है, बस एक अमूर्त वर्ग क्या है। – wich

+0

मैंने एक अमूर्त वर्ग के स्पष्टीकरण को स्पष्ट रूप से इंगित किया है कि एक ठोस वर्ग क्या है। इसके अतिरिक्त, सी ++ एफएक्यू लाइट एक बहुत ही उपयोगी साइट है। इसलिए, मैंने उपहास किया। –

+0

@wich मेरे लिए यह स्पष्ट है कि यदि एक अमूर्त वर्ग "एक वर्ग है जिसमें एक या अधिक शुद्ध वर्चुअल सदस्य फ़ंक्शन हैं" तो एक ठोस वर्ग एक वर्ग है जो नहीं है !!! या क्या अर्ध-अमूर्त वर्ग है? सादगी के साथ –

1

बेस स्तरीय बनाम व्युत्पन्न वर्ग सार वर्ग बनाम ठोस वर्ग के लिए एक ओर्थोगोनल अवधारणा है।

एक बेस क्लास वह है जो किसी अन्य वर्ग से प्राप्त नहीं होता है। एक व्युत्पन्न वर्ग किसी अन्य वर्ग से प्राप्त होता है।

एक अमूर्त वर्ग वह है जिसमें एक या अधिक शुद्ध आभासी कार्य होते हैं। एक ठोस वर्ग में कोई शुद्ध आभासी नहीं है।

एक अमूर्त वर्ग या तो बेस क्लास या व्युत्पन्न वर्ग हो सकता है (यह किसी अन्य अमूर्त वर्ग से लिया गया है)। एक ठोस वर्ग या तो आधार या व्युत्पन्न हो सकता है। व्युत्पन्न कक्षा में शुद्ध वर्चुअल फ़ंक्शन जोड़कर, आप कंक्रीट क्लास से एक अमूर्त वर्ग भी प्राप्त कर सकते हैं। लेकिन सामान्य उपयोग में, एक आधार अमूर्त वर्ग और एक या अधिक कंक्रीट व्युत्पन्न कक्षाएं होती हैं।

0

कंक्रीट कक्षा में इसकी सभी विधि लागू की गई हैं। सार वर्ग अपनी सभी विधि को छोड़कर कुछ (कम से कम एक) विधि को लागू नहीं किया गया है ताकि आप इसे विस्तारित कर सकें और अन-कार्यान्वित विधि को कार्यान्वित कर सकें।

लाभ: अमूर्त वर्ग से विस्तार करके आपको बेस क्लास & की सभी कार्यक्षमता मिलती है, आपको अन-कार्यान्वित विधि को लागू करने के लिए 'मजबूर' किया जाएगा। इसलिए क्लास के डिजाइनर मूल रूप से आपको किसी भी उपयोग के वर्ग से पहले अमूर्त विधि में कोड लिखने के लिए मजबूर कर रहे हैं।

20

सार वर्ग ऑब्जेक्ट बनाने के लिए उपयोग नहीं किया जा सकता है। जबकि, ठोस वर्ग ऑब्जेक्ट बनाने के लिए उपयोग किया जा सकता है।

कंक्रीट का अर्थ है 'वास्तविकता में मौजूद या वास्तविक अनुभव में; इंद्रियों से समझने योग्य; असली ''। जबकि, अमूर्त का अर्थ है 'लागू या प्रैक्टिकल नहीं; सैद्धांतिक '।

एक अमूर्त कक्षा को तत्काल नहीं किया जा सकता है। जबकि, ठोस कोई भी कर सकता है।

एक अमूर्त कक्षा एक है जिसमें एक या अधिक शुद्ध वर्चुअल फ़ंक्शन है। जबकि ठोस कक्षा में कोई शुद्ध वर्चुअल फ़ंक्शन नहीं है।

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