2014-06-25 3 views
9

मान लीजिए मैं हमेशा की तरह class Animal सार वर्ग और class Dog : public Animalclass Cat : public Animal यह एक ठोस वर्ग आप से एक वस्तु का दृष्टांत कर सकते हैं बनाता है कि है। मान लीजिए कि आपके पास foo(Animal a) फ़ंक्शन है, या तो बिल्लियों या कुत्ते को ऑब्जेक्ट्स के रूप में लेना। सी ++ शुरुआती दिनों में सी को संकलित करता था, और वहां वस्तुओं को बनाए रखने के लिए vTable का निर्माण करेगा।अवधारणाओं को स्पष्ट करने से पहले बहुरूपता और विरासत के लिए सी मुहावरे क्या थे?

लेकिन मेरे एक छात्र ने मुझसे यह प्रश्न पूछा: इन अवधारणाओं से पहले प्रोग्रामर के बीच सामान्य बात थी, वे वास्तव में सी में अपने दिन-प्रति-दिन कोडिंग में कैसे करते थे? सी में इन अवधारणाओं को प्रोग्राम करने के लिए बेवकूफ तरीका क्या था?

मैंने लिनक्स कर्नेल और अन्य ओएसएस परियोजनाओं के माध्यम से निकल लिया है, लेकिन मुझे एक स्पष्ट पैटर्न नहीं मिला है: कभी-कभी यह यूनियन (विभिन्न structs के लिए), कभी-कभी यह फ़ंक्शन पॉइंटर्स इत्यादि होता है लेकिन मैं चाहता हूं जो किया है और एक वाक्य में सी

साथ बहुत अनुभव है गया है उद्योग में जानकार लोगों से एक सीधा जवाब की तरह: विरासत और बहुरूपता के लिए मुहावरेदार सी क्या है? इस तरह के स्कूल के कार्य के लिए लिखा उन लोगों के रूप

+3

1) स्मार्ट यूनियन 2) फ़ंक्शन पॉइंटर्स स्ट्रक्चर/यूनियन सदस्यों के रूप में। उदाहरण के लिए लिनक्स डिवाइस ड्राइवरों को कैसे नियंत्रित करता है (ब्लॉक) कैसे करें। – wildplasser

+0

मुझे नहीं लगता कि ऐसा करने का एक बेवकूफ तरीका था, AFAIK जो सी ++ के विक्रय बिंदुओं में से एक था। यह आलेख भी दिमाग में आता है http://www.yosefk.com/blog/oo-c-is-passable.html (सी में ओओ अनुकरण करने पर) –

+0

@ विल्डप्लेसर: धन्यवाद। "यूनियनों" से अलग "स्मार्ट यूनियन" हैं? मैं इस अवधारणा से परिचित नहीं हूं, क्योंकि "पॉइंटर्स" हैं और फिर "स्मार्ट पॉइंटर्स" हैं। –

उत्तर

7

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

बहुरूपता ही आसानी से समारोह संकेत दिए गए कि एक स्पष्ट self तर्क प्राप्त के साथ व्यक्त की है। ओपन एंडेड विरासत "प्राप्त" संरचना अपने सुपर क्लास एम्बेड करने के साथ प्राप्त किया जा सकता है: struct inherited को

struct base { 
    // ... members here ... 
}; 

struct inherited { 
    struct base base; 
    // ... inherited members here ... 
}; 

प्वाइंटर सुरक्षित रूप से struct base * लिए डाली जा सकती है, एक अभ्यास स्पष्ट सी मानक का आशीर्वाद। ये कास्ट आम तौर पर मैक्रोज़ के पीछे छिपाए जाते हैं, जो संभवतः रनटाइम प्रकार की जांच भी कर सकते हैं।

इस को लागू करने, काफी बोझल है के बाद से वहाँ कोई टेम्पलेट्स, विनाशकर्ता, कोई अपवाद का कोई स्वचालित मंगलाचरण है, और कोई एसटीएल हैं। दूसरे शब्दों में, प्रोग्रामर द्वारा त्रुटि प्रबंधन और विनाशक आमंत्रण सावधानी से संभाला जाना चाहिए, और प्रकार भिन्नता को रन-टाइम पर कॉलबैक द्वारा संभाला जाना चाहिए (std::sort() और qsort() के बीच अंतर पर विचार करें) या प्रीप्रोसेसर चाल को बनाए रखने के लिए कड़ी मेहनत करें।

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

+0

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

+0

@DervinThunk हां, यही सी ++ "अपस्टास्ट" कहलाएगा और यहां तक ​​कि निष्पादन भी करेगा। – user4815162342

+0

और इसके विपरीत कैसे: "डाउनकास्टिंग", मान लीजिए, जब आप 'स्ट्रक्चर बेस' पास करते हैं, तो आपके उदाहरण में, और "असली" ऑब्जेक्ट ढूंढने की आवश्यकता होती है? मुझे लगता है कि आप फ़ंक्शन में ऑब्जेक्ट के प्रकार को भी पास कर सकते हैं, या स्ट्रक्चर में टाइप कुछ एनम है? क्या यह सामान्य अभ्यास होगा? –

-1

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के फायदे से पहले, एप्लिकेशन प्रक्रियात्मक कोड का उपयोग कर रहे थे, जहां कार्यक्षमता अबाध के साथ काम करने वाले पदानुक्रम के शीर्ष पर वाले कार्यों के पदानुक्रम में "encapsulated" थी और हम अधिक से अधिक ठोस और विस्तृत हो रहे थे पदानुक्रम नीचे जाओ। कुछ एपीआई संरचनाओं को बनाने के तरीके प्रदान करते हैं जिन्हें केवल हैंडल के माध्यम से छेड़छाड़ की जा सकती है। उदाहरण: सी में, फ़ाइल हैंडल फ़ाइलों से निपटने के विवरण छुपाएं।

सी में OO करने के लिए के रूप में, मेरा मानना ​​है कि यह उचित निर्माणों के साथ उचित भाषा समर्थन के बिना एक व्यवहार्य विकल्प नहीं था। जो आपको मिलेगा वह पॉइंटर्स के साथ ओओ को फोकस करने में शामिल दर्द के लायक नहीं था।

+0

मेरे अनुभव में सबसे बड़े सी कार्यक्रम * कुछ * प्रकार के ओओपी कार्यान्वयन में वृद्धि हुई, आम तौर पर बग-सवार, कम प्रदर्शन और अंडरस्पेसिस्ड, जैसा कह रहा है। इस शैली के लिए अंतर्निहित भाषा समर्थन प्री-टेम्पलेट सी ++ के राइस डी'एट्रे था। – user4815162342

0

मैंने कोड देखा जो स्रोत में सार नाम बनाने और फ़ाइलों को शामिल करने के लिए #defines का उपयोग किया गया था। उदाहरण के लिए, बाइट्स, short एस, int एस, float एस, और double एस से निपटने के लिए उसी दिनचर्या का पुन: उपयोग किया जा सकता है। कोड गन्दा और समझने में मुश्किल था।

+2

वह _ मैनेरिक_ कोड बनाने के लिए एक्स मैक्रो का उपयोग करेगा, ओओपी कोड नहीं। – ninjalj

+0

polymorphism = जेनेरिक। – Jiminion

+0

एक सी ++ संदर्भ में, मेरा मानना ​​है कि पॉलीमोर्फिज्म पॉइंटर या बेस क्लास के संदर्भ के माध्यम से उप-वर्ग में ओवरराइड किए गए 'वर्चुअल' विधियों को आविष्कार करके सक्षम रन-टाइम विधि प्रेषण को संदर्भित करता है। सी ++ में जेनेरिक प्रोग्रामिंग टेम्पलेट्स के साथ महसूस किया जाता है और इसे आम तौर पर बहुरूपता के रूप में जाना जाता है। – user4815162342

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