C++ में इनहेरिटेंस: public, private, protected और प्रदर्शन

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C++ में इनहेरिटेंस मॉडिफायर्स के पीछे क्या छिपा है?

\n\n

कल्पना करें कि आप एक आर्किटेक्ट हैं। आपके पास एक "इमारत" का ब्लूप्रिंट (बेस क्लास) है, और आप उसके अनुसार तीन अलग-अलग "घर" (डिराइव्ड क्लास) बनाना चाहते हैं। एक घर सार्वजनिक प्रवेश द्वार (public) के साथ सटीक प्रतिलिपि होगा, दूसरा बंद आंतरिक आंगन (private) के साथ, और तीसरा केवल परिवार और दोस्तों (protected) के लिए सुलभ होगा। C++ में, इनहेरिटेंस मॉडिफायर बिल्कुल इसी तरह काम करते हैं। लेकिन क्या यह विकल्प प्रोग्राम की गति को प्रभावित करता है? स्पॉयलर: हाँ और नहीं दोनों। आइए जानें कि कैसे अपने पैर में गोली न मारें और साथ ही कोड को ऑप्टिमाइज़ करें।

\n\n

यह प्रश्न Stack Overflow पर सबसे लोकप्रिय में से एक है (दसियों हज़ार व्यूज़), और यह व्यर्थ नहीं है। शुरुआती अक्सर क्लास के सदस्यों तक पहुँच स्तर और इनहेरिटेंस के प्रकार को भ्रमित करते हैं। और अनुभवी डेवलपर्स जानते हैं: इनहेरिटेंस का सही चुनाव डीबगिंग के घंटे बचा सकता है और प्रोग्राम को थोड़ा तेज़ भी कर सकता है। आज pythonlib.ru पर हम इस विषय को हमेशा के लिए बंद कर देंगे।

\n\n

इनहेरिटेंस का त्रिकोण: public, private, protected

\n\n

शुरुआत के लिए — आधार। मान लीजिए कि हमारे पास एक बेस क्लास Animal है:

\n\n
class Animal {\npublic:\n    void eat() { /* ... */ }\nprotected:\n    int age;\nprivate:\n    std::string secretDNA;\n};
\n\n

अब देखते हैं कि तीन प्रकार के इनहेरिटेंस डिराइव्ड क्लास Dog में इन सदस्यों तक पहुँच को कैसे बदलते हैं।

\n\n

1. Public इनहेरिटेंस — "जैसा है वैसा"

\n

सबसे सामान्य और सहज प्रकार। सभी पहुँच स्तर अपरिवर्तित रहते हैं:

\n
    \n
  • public → public (सभी के लिए सुलभ)
  • \n
  • protected → protected (उत्तराधिकारियों के लिए सुलभ)
  • \n
  • private → असुलभ (बेस क्लास में ही रहता है)
  • \n
\n

इसका उपयोग तब करें जब आप "Dog IS-A Animal" संबंध व्यक्त करना चाहते हैं। यह क्लासिकल OOP है।

\n\n

2. Protected इनहेरिटेंस — "केवल अपनों के लिए"

\n

बेस क्लास के सभी public सदस्य डिराइव्ड क्लास में protected हो जाते हैं:

\n
    \n
  • public → protected
  • \n
  • protected → protected
  • \n
  • private → असुलभ
  • \n
\n

इसकी आवश्यकता तब होती है जब आप कार्यान्वयन विवरण को बाहरी दुनिया से छिपाना चाहते हैं, लेकिन "पोते-पोतियों" को पहुँच की अनुमति देना चाहते हैं। उदाहरण के लिए, Boost लाइब्रेरी आंतरिक तंत्र के लिए सक्रिय रूप से protected इनहेरिटेंस का उपयोग करती है।

\n\n

3. Private इनहेरिटेंस — "मेरा और सिर्फ मेरा"

\n

सबसे सख्त मोड। सभी public और protected सदस्य private हो जाते हैं:

\n
    \n
  • public → private
  • \n
  • protected → private
  • \n
  • private → असुलभ
  • \n
\n

यह "Dog को Animal के माध्यम से कार्यान्वित किया गया है" संबंध है। इसका उपयोग अक्सर ऑप्टिमाइज़ेशन के लिए कम्पोज़ीशन के बजाय किया जाता है (इसके बारे में नीचे)।

\n\n

प्रदर्शन: असली बात कहाँ है?

\n\n

अब — मुख्य दिलचस्प प्रश्न पर: क्या इनहेरिटेंस का प्रकार प्रदर्शन को प्रभावित करता है? संक्षेप में: सीधे तौर पर — नहीं, लेकिन अप्रत्यक्ष रूप से — बहुत ज्यादा।

\n\n

मिथक: private इनहेरिटेंस public से तेज़ है

\n

कुछ लोग सोचते हैं कि private इनहेरिटेंस "अनावश्यक जाँचों को हटा देता है"। यह सच नहीं है। एक्सेस मॉडिफायर (public, protected, private) पूरी तरह से compile-time अवधारणा हैं। कंपाइलर बिल्ड चरण में उनकी जाँच करता है और समान मशीन कोड उत्पन्न करता है। रनटाइम में कोई अंतर नहीं है।

\n\n

वास्तविकता: empty base optimization (EBO) के माध्यम से अनुकूलन

\n

यहाँ है जहाँ private इनहेरिटेंस वास्तव में प्रोग्राम को गति देता है! यदि बेस क्लास में कोई डेटा नहीं है (खाली क्लास), तो public या protected इनहेरिटेंस में कंपाइलर संभावित रूप से (लेकिन बाध्य नहीं) संरेखण के लिए एक अतिरिक्त बाइट जोड़ सकता है। जबकि private इनहेरिटेंस में Empty Base Optimiz

ब्लॉग

पुस्तक अनुशंसाएँ