C ++ में, एनकैप्सुलेशन यूनिट क्लास है

लेख का शीर्षक वास्तव में एक कथन नहीं है, बल्कि दो हैं, हालांकि दोनों ज्ञात हैं:
  1. सी ++ में, एनकैप्सुलेशन यूनिट एक वर्ग है - एक अलग वस्तु नहीं ([स्ट्रॉस्ट्रुप 3 ई], 24.3.7.4)।
  2. सी ++ में, एनकैप्सुलेशन यूनिट एक वर्ग है - एक वर्ग नहीं, साथ में इसकी निचली पदानुक्रम।

दूसरा कथन तुच्छ नहीं है, क्योंकि, उदाहरण के लिए, संरक्षित सदस्यों की निम्नलिखित व्याख्या लोकप्रिय है ([स्ट्रॉस्ट्रुप 3 ई], 15.3):
यदि कोई सदस्य सुरक्षित है, तो उसका नाम केवल उस कक्षा के सदस्य कार्यों और दोस्तों में उपयोग किया जा सकता है जिसमें वह घोषित किया गया है, और उससे प्राप्त कक्षाएं।

वास्तव में, यह कथन, गणितीय भाषा में, आवश्यक है, लेकिन पर्याप्त नहीं है:
संरक्षित सदस्य के नाम का उपयोग करने के लिए, यह आवश्यक है, लेकिन पर्याप्त नहीं है, यह नाम उस सदस्य फ़ंक्शन या उस वर्ग के मित्र से प्राप्त किया जाता है जिसमें वह घोषित किया गया है, या उससे प्राप्त वर्गों से।
कथन केवल स्पष्टीकरण के साथ ([स्ट्राउस्ट्रुप ३ ई), १५.३.१) आवश्यक और पर्याप्त हो जाता है:
एक व्युत्पन्न वर्ग एक बेस क्लास के संरक्षित सदस्यों को केवल अपने प्रकार की वस्तुओं के लिए उपयोग कर सकता है।

प्रदर्शित करने के लिए, यहाँ कोड है:
class Base { protected: void protected_f() {} private: void private_f() {} public: void base_f() { private_f(); //correct: *this object therefore object of own class Base Base b; b.private_f(); //correct: b is object of class Base (1) } }; class Derived : public Base { void derived_f() { Derived d; d.protected_f(); //correct: d is object of class Derived therefore d->Derived::f() is called (2) Base b; b.protected_f(); //compiler error: Base::f() is protected (3) ((Derived*)(&b))->protected_f(); //dangerous non-dynamic downcast, but w/o compiler error (4) } }; 

पहला कथन तुच्छ है और प्रदर्शित किया गया है (1): यह-> base_f () कॉल b.pStreet_f (), कॉल सही है, क्योंकि * * यह और b अलग-अलग ऑब्जेक्ट हैं, वे एक ही बेस क्लास की ऑब्जेक्ट हैं।
दूसरा कथन (2) और (3) द्वारा प्रदर्शित किया गया है। कॉल (2) सही है, क्योंकि नाम प्रोटेक्टेड_ एफ को डिराइव्ड क्लास में विरासत में मिला है और यह-> व्युत्पन्न_एफ () कॉल डी। वेरिफाइड :: प्रोटेक्टेड एफएफ () - डिराइव्ड क्लास का एक फंक्शन, और * यह और डी एक ही डिराइव्ड क्लास के अलग-अलग ऑब्जेक्ट्स हैं। इनकैप्सुलेशन को तोड़ने के प्रयास के कारण कॉल (3) सही नहीं है: यह- व्युत्पन्न वर्ग का * व्युत्पन्न () व्युत्पन्न वर्ग का ऑब्जेक्ट बेस क्लास के ऑब्जेक्ट बी के संरक्षित बेस :: संरक्षित_एफ () को कॉल करने की कोशिश करता है, जो कि इसकी एनकैप्सुलेशन यूनिट से परे जाने के लिए - व्युत्पन्न वर्ग आधार-व्युत्पन्न पदानुक्रम। यह-> व्युत्पन्न_ () को केवल उन्हीं संरक्षित सदस्यों को बुलाने का अधिकार है, जो उसी व्युत्पन्न वर्ग की वस्तुओं से संबंधित हैं, जैसे कि * यह, उदाहरण के लिए, व्युत्पन्न :: संरक्षित_फ ()।
लाइन (4) दर्शाती है कि एनकैप्सुलेशन यूनिट के बारे में कथन का दूसरा भाग पहले की तुलना में आसान है: यदि एनकैप्सुलेशन यूनिट के बाहर के निजी सदस्यों तक पहुंचने के लिए, आपको निम्न चालें का सहारा लेना होगा जैसे ऑब्जेक्ट इंस्टेंस के निम्न-स्तरीय रूपांतरण या कीवर्ड को ओवरराइड करना, तब के लिए इनकैप्सुलेशन उल्लंघन के साथ संरक्षित सदस्यों तक पहुंच कम सी-स्टाइल कास्ट पॉइंटर्स के लिए पर्याप्त है।

निष्कर्ष में, हम ध्यान देते हैं कि एनकैप्सुलेशन की इकाई के बारे में कथन के द्वंद्व को कई बिंदुओं से देखा जा सकता है:


साहित्य


[स्ट्रॉस्ट्रुप 3 ई] बी स्ट्रॉज़पुप। C ++ प्रोग्रामिंग लैंग्वेज, तीसरा एड। / ट्रांसलेशन। अंग्रेजी से - एसपीबी; एम।: "नेव्स्की बोली" - "पब्लिशिंग हाउस बिनॉम", 1991


Source: https://habr.com/ru/post/In170127/


All Articles