स्वीकृत उत्तर इसे आभासी निजी कार्यों के लिए समझाता है , लेकिन यह केवल प्रश्न के एक विशिष्ट पहलू का उत्तर देता है, जो कि ओपी द्वारा पूछे गए प्रश्नों की तुलना में काफी सीमित है। इसलिए, हमें पुन: प्रयास करने की आवश्यकता है: हमें हेडर में गैर-आभासी निजी कार्यों की घोषणा करने की आवश्यकता क्यों है ?
एक अन्य जवाब इस तथ्य को आमंत्रित करता है कि कक्षाओं को एक ब्लॉक में घोषित किया जाना चाहिए - जिसके बाद वे सील कर दिए जाते हैं और उन्हें जोड़ा नहीं जा सकता। तो हैडर में एक निजी विधि घोषित करने के लिए आप इसे छोड़कर कहीं और जाकर इसे परिभाषित करने की कोशिश कर रहे हैं। अच्छी बात है। कक्षा के कुछ उपयोगकर्ताओं को इसे इस तरह से बढ़ाने में सक्षम होना चाहिए कि अन्य उपयोगकर्ता निरीक्षण न कर सकें? निजी तरीके इसका हिस्सा हैं और इसे इससे बाहर नहीं किया जाता है। लेकिन फिर आप पूछते हैं कि वे क्यों शामिल हैं, और यह थोड़ा तना हुआ लगता है। कक्षा उपयोगकर्ताओं को उनके बारे में क्यों जानना चाहिए? यदि वे दिखाई नहीं देते थे, तो उपयोगकर्ता कोई भी जोड़ नहीं सकते थे, और हे प्रिस्टो।
इसलिए, मैं एक उत्तर प्रदान करना चाहता था, जो कि डिफ़ॉल्ट रूप से निजी तरीकों को शामिल करने के बजाय, उपयोगकर्ताओं को दिखाई देने के पक्ष में विशिष्ट बिंदु प्रदान करता है। सार्वजनिक घोषणा की आवश्यकता वाले गैर-आभासी निजी कार्यों के लिए एक यंत्रवत कारण हर्ब सटर के गॉटडब्ल्यू # 100 में अपने तर्क के हिस्से के रूप में पिंपल मुहावरे के बारे में दिया गया है। मैं यहाँ पिम्पल के बारे में नहीं जाऊँगा, क्योंकि मुझे यकीन है कि हम सभी इसके बारे में जानते हैं। लेकिन यहाँ प्रासंगिक सा है:
C ++ में, जब हेडर फ़ाइल वर्ग परिभाषा में कुछ भी बदलता है, तो उस वर्ग के सभी उपयोगकर्ताओं को पुन: संकलित किया जाना चाहिए - भले ही एकमात्र परिवर्तन निजी वर्ग के सदस्यों के लिए था कि वर्ग के उपयोगकर्ता भी एक्सेस नहीं कर सकते। इसका कारण यह है कि C ++ का बिल्ड मॉडल टेक्स्ट इंक्लूजन पर आधारित है, और क्योंकि C ++ मानता है कि कॉलर्स एक वर्ग के बारे में दो मुख्य बातें जानते हैं जो निजी सदस्यों से प्रभावित हो सकते हैं:
- आकार और लेआउट : [सदस्यों और आभासी कार्यों के लिए - आत्म-व्याख्यात्मक और प्रदर्शन के लिए महान, लेकिन हम यहां क्यों नहीं हैं]
- कार्य : कॉलिंग कोड को कक्षा के सदस्य कार्यों के लिए कॉल को हल करने में सक्षम होना चाहिए, जिसमें दुर्गम निजी कार्य शामिल हैं जो गैर-वित्तीय कार्यों के साथ ओवरलोड होते हैं - यदि निजी फ़ंक्शन एक बेहतर मैच है, तो कॉलिंग कोड संकलित करने में विफल रहेगा। (C ++ ने सुरक्षा कारणों से एक्सेसिबिलिटी चेक करने से पहले अधिभार रिज़ॉल्यूशन करने के लिए जानबूझकर डिज़ाइन निर्णय लिया। उदाहरण के लिए, यह महसूस किया गया कि निजी से सार्वजनिक रूप से किसी फ़ंक्शन की एक्सेसिबिलिटी को बदलने से कानूनी कॉलिंग कोड का अर्थ नहीं बदलना चाहिए।)
बेशक, समिति के सदस्य के रूप में एक अत्यंत विश्वसनीय स्रोत है, इसलिए जब वह किसी को देखता है, तो वह "जानबूझकर डिजाइन निर्णय" जानता है। और बाद में बदले हुए शब्दार्थ या आकस्मिक रूप से टूटी पहुंच से बचने के लिए निजी तरीकों की सार्वजनिक घोषणा की आवश्यकता का विचार शायद सबसे ठोस तर्क है। शुक्र है, जैसा कि अब से पहले पूरी बात व्यर्थ लग रही थी!