विषय में सवाल एक बहुत आम भ्रम का सुझाव देता है। भ्रम काफी आम है, C++ FAQ लंबे समय तक निजी वर्चुअल का उपयोग करने के खिलाफ वकालत की, क्योंकि भ्रम एक बुरी चीज लग रहा था।
तो पहले भ्रम से छुटकारा पाने के लिए: हां, निजी वर्चुअल फ़ंक्शंस व्युत्पन्न कक्षाओं में ओवरराइड किया जा सकता है। व्युत्पन्न कक्षाओं के तरीके बेस क्लास से आभासी कार्यों को कॉल नहीं कर सकते हैं, लेकिन वे उनके लिए अपना कार्यान्वयन प्रदान कर सकते हैं। हर्ब सटर के मुताबिक, बेस क्लास में सार्वजनिक गैर वर्चुअल इंटरफ़ेस और व्युत्पन्न कक्षाओं में अनुकूलित किया जा सकता है, जो कार्यान्वयन के अनुकूलन व्यवहार के विनिर्देश से इंटरफेस के विनिर्देश को बेहतर करने की अनुमति देता है। आप इसके लेख "Virtuality" में इसके बारे में अधिक पढ़ सकते हैं।
हालांकि आपके द्वारा प्रस्तुत कोड में एक और दिलचस्प बात है, जो मेरी राय में कुछ और ध्यान देने योग्य है। सार्वजनिक इंटरफ़ेस में अधिभारित गैर वर्चुअल फ़ंक्शंस का एक सेट होता है और वे फ़ंक्शन गैर-सार्वजनिक, गैर-अधिभारित वर्चुअल फ़ंक्शंस को कॉल करते हैं। सामान्य रूप से सी ++ दुनिया में यह एक मुहावरे है, इसका नाम है और निश्चित रूप से यह उपयोगी है। नाम
"सार्वजनिक अतिभारित गैर Virtuals कॉल संरक्षित गैर अतिभारित Virtuals" (आश्चर्य, आश्चर्य!)
यह properly manage the hiding rule करने में मदद करता है। आप इसके बारे में here के बारे में अधिक पढ़ सकते हैं, लेकिन मैं इसे जल्द ही समझाने की कोशिश करूंगा।
कल्पना कीजिए कि Engine
कक्षा का वर्चुअल फ़ंक्शन भी इसका इंटरफ़ेस है और यह ओवरलोडेड फ़ंक्शंस का एक सेट है जो शुद्ध वर्चुअल नहीं है। यदि वे शुद्ध आभासी थे, तो नीचे वर्णित अनुसार, एक भी समस्या का सामना कर सकता है, लेकिन वर्ग पदानुक्रम में कम है।
class Engine
{
public:
virtual void SetState(int var, bool val) {/*some implementation*/}
virtual void SetState(int var, int val) {/*some implementation*/}
};
अब मान लेते हैं तो आप एक व्युत्पन्न वर्ग का निर्माण करना चाहते हैं और आप केवल विधि, कि तर्क के रूप में दो ints लेता है के लिए एक नया कार्यान्वयन प्रदान करने की आवश्यकता हैं।
class MyTurbochargedV8 : public Engine
{
public:
// To prevent SetState(int var, bool val) from the base class,
// from being hidden by the new implementation of the other overload (below),
// you have to put using declaration in the derived class
using Engine::SetState;
void SetState(int var, int val) {/*new implementation*/}
};
आप व्युत्पन्न वर्ग में घोषणा का उपयोग कर डाल करने के लिए (या दूसरा अधिभार को फिर से परिभाषित करने के लिए) भूल गए हैं, आप नीचे दिए गए परिदृश्य में मुसीबत में पड़ सकता है।
MyTurbochargedV8* myV8 = new MyTurbochargedV8();
myV8->SetState(5, true);
आप Engine
सदस्यों के छिपने की, बयान को रोकने नहीं दिए थे:
myV8->SetState(5, true);
व्युत्पन्न वर्ग से void SetState(int var, int val)
कहेंगे, int
को true
परिवर्तित।
इंटरफ़ेस आभासी नहीं है और आभासी कार्यान्वयन गैर सरकारी है, अपने उदाहरण के रूप में, व्युत्पन्न वर्ग के लेखक एक कम समस्या के बारे में सोचना है और बस
class MyTurbochargedV8 : public Engine
{
private:
void SetStateInt(int var, int val) {/*new implementation*/}
};
+1 "पब्लिक ओवरलोडेड गैर-वर्चुअल कॉल संरक्षित गैर-ओवरलोडेड वर्चुअल" xD – GabLeRoux
वर्चुअल फ़ंक्शन को निजी क्यों होना चाहिए? क्या यह सार्वजनिक हो सकता है? – Rich
मुझे आश्चर्य है कि क्या उसके "वर्चुअल" लेख में हर्ब सटर द्वारा दिए गए दिशानिर्देश आज भी हैं? – nurabha