दिलचस्प पोस्ट
getOutputStream () को पहले ही इस प्रतिक्रिया के लिए बुलाया गया है मुख्य टैब बार नियंत्रक से पहले लॉगिन दृश्य नियंत्रक दिखा रहा है JQuery का उपयोग करने के लिए कुछ अनुभवजन्य तकनीकी कारण क्या हैं? बिटवर्ड या 0 से फर्श पर नंबर का उपयोग करना जांचें कि दो अनारॉर्डेड सूचियां समान हैं अक्ष के चारों ओर एक चतुष्कोणीय रोटेशन के घटक कोई मान प्राप्त करने के लिए स्ट्रिंग का उपयोग करने के लिए एक सरणी अनुक्रमणिका पथ के रूप में कैसे करें? Google क्लाउड मेसेजिंग पंजीकरण त्रुटि को कैसे ठीक करें: SERVICE_NOT_AVAILABLE? जेडीबीसी कनेक्शन विफल रहा, त्रुटि: मेजबान के लिए टीसीपी / आईपी कनेक्शन विफल रहा एप्लिकेशन समूह के साथ ऐप्स के बीच डेटा संचार और जारी रहें एसक्यूएल सम्मिलित: जहां खंड पर बनाम खंड किसी अन्य थ्रेड से यूआई विधि को कैसे खोलें माउस / कैनवास एक्स, वाई टू थ्री। जेएस वर्ल्ड एक्स, वाई, जेड लक्ष्य प्लेटफार्मों को सूचीबद्ध करने में असमर्थ कृपया सुनिश्चित करें कि एंड्रॉइड एसडीके पथ सही है एक हाइपरलिंक में एक अलग पोर्ट नंबर के लिए सापेक्ष यूआरएल?

आभासी फ़ंक्शन डिफ़ॉल्ट तर्क व्यवहार

मैं निम्नलिखित कोड पर एक अजीब स्थिति है कृपया इसे स्पष्ट करने में मेरी मदद करें।

class B { public: B(); virtual void print(int data=10) { cout << endl << "B--data=" << data; } }; class D:public B { public: D(); void print(int data=20) { cout << endl << "D--data=" << data; } }; int main() { B *bp = new D(); bp->print(); return 0; } 

मैं अपेक्षित उत्पादन के बारे में

 [ D--data=20 ] 

लेकिन व्यावहारिक में यह है

 [ D--data=10 ] 

कृपया मदद करे। यह आपके लिए स्पष्ट प्रतीत हो सकता है लेकिन मुझे आंतरिक तंत्र के बारे में जानकारी नहीं है।

वेब के समाधान से एकत्रित समाधान "आभासी फ़ंक्शन डिफ़ॉल्ट तर्क व्यवहार"

डिफ़ॉल्ट तर्क पूरी तरह से संकलन समय सुविधा है। यद्यपि लापता तर्क के स्थान पर डिफ़ॉल्ट तर्कों का प्रतिस्थापन संकलन समय पर किया जाता है। इस कारण से, स्पष्ट रूप से, सदस्य कार्यों के लिए डिफ़ॉल्ट तर्क चयन कोई भी रास्ता नहीं है, ऑब्जेक्ट के गतिशील (यानी रन-टाइम) प्रकार पर निर्भर कर सकते हैं। यह हमेशा स्थिर (या संकलन-समय) ऑब्जेक्ट के प्रकार पर निर्भर करता है।

आपके कोड नमूने में आपके द्वारा लिखी गई कॉल को संकलक द्वारा तुरंत bp->print(10) रूप में परिभाषित किया गया है, कुछ और परवाह किए बिना

मानक कहते हैं (8.3.6.10):

एक आभासी फ़ंक्शन कॉल (10.3) ऑब्जेक्ट को दर्शाने वाले सूचक या संदर्भ के स्थिर प्रकार द्वारा निर्धारित आभासी फ़ंक्शन की घोषणा में डिफ़ॉल्ट तर्क का उपयोग करता है। व्युत्पन्न वर्ग में एक ओवरराइडिंग फ़ंक्शन, उस फ़ंक्शन से डिफ़ॉल्ट तर्क प्राप्त नहीं करता है जो इसे ओवरराइड करता है।

इसका मतलब है, चूंकि आप टाइप B की एक सूचक के माध्यम से print कर रहे हैं, यह B::print की डिफ़ॉल्ट तर्क का उपयोग करता है।

आम तौर पर, उन डिफ़ॉल्ट तर्कों का उपयोग किया जाता है जो एक निश्चित दायरे में दिखाई देते हैं। आप कर सकते हैं (लेकिन नहीं) कायरता बातें:

 #include <iostream> void frob (int x) { std::cout << "frob(" << x << ")\n"; } void frob (int = 0); int main () { frob(); // using 0 { void frob (int x=5) ; frob(); // using 5 } { void frob (int x=-5) ; frob(); // using -5 } } 

आपके मामले में, बेस क्लास हस्ताक्षर दिखाई दे रहा है। व्युत्पन्न डिफ़ॉल्ट तर्कों का उपयोग करने के लिए, आपको स्पष्ट रूप से उस फ़ंक्शन को अपने व्युत्पन्न वर्ग में एक सूचक के माध्यम से, या तो उस तरीके से घोषित करके, या इसे सही ढंग से कास्टिंग करके स्पष्ट रूप से कॉल करना होगा

डिफ़ॉल्ट तर्क मान कॉलर की ओर से पारित किया गया है। कॉलर दृष्टिकोण से यह कक्षा बी (नहीं डी) के साथ काम करता है, इसलिए यह 10 (कक्षा बी के लिए) से गुजरता है

आपका चर प्रकार बी का है, इसलिए बी के फ़ंक्शन को बुलाया जाएगा। डी को कॉल करने के लिए, आपको अपने वैरिएबल को डी के रूप में घोषित करना होगा, या डी को डालना होगा।

गतिशील बाइंडिंग vpointer और vtable का प्रयोग कर रहा है। हालांकि, गतिशील बाध्यकारी केवल फ़ंक्शन पॉइंटर पर लागू होता है। गतिशील बाध्य तर्क के लिए कोई तंत्र नहीं है

इस प्रकार, डिफ़ॉल्ट तर्क संकलक समय पर स्थिर रूप से निर्धारित होता है। इस मामले में, यह स्थैतिक बीपी प्रकार से निर्धारित किया जाता है, जो बेस क्लास के लिए एक सूचक है। इस प्रकार डेटा = 10 फ़ंक्शन तर्क के रूप में पारित किया जाता है, जबकि फंक्शन पॉइंटर Derived class सदस्य फ़ंक्शन की ओर इशारा कर रहा है: D :: print। मूलतः, यह डी :: प्रिंट (10) कॉल करता है

निम्न कोड स्निपेट और परिणामी आउटपुट स्पष्ट रूप से बिंदु प्रदर्शित करते हैं: भले ही वह व्युत्पन्न कॉल सदस्य फ़ंक्शन Derived :: resize (int) कहलाता है, यह बेस कक्षा डिफ़ॉल्ट तर्क पास करता है: size = 0

वर्चुअल शून्य निकला :: आकार बदलना (पूर्णांक) आकार 0

 #include <iostream> #include <stdio.h> using namespace std; #define pr_dbgc(fmt,args...) \ printf("%d %s " fmt "\n",__LINE__,__PRETTY_FUNCTION__, ##args); class Base { public: virtual void resize(int size=0){ pr_dbgc("size %d",size); } }; class Derived : public Base { public: void resize(int size=3){ pr_dbgc("size %d",size); } }; int main() { Base * base_p = new Base; Derived * derived_p = new Derived; base_p->resize(); /* calling base member function resize with default argument value --- size 0 */ derived_p->resize(); /* calling derived member function resize with default argument default --- size 3 */ base_p = derived_p; /* dynamic binding using vpointer and vtable */ /* however, this dynamic binding only applied to function pointer. There is no mechanism to dynamic binding argument. */ /* So, the default argument is determined statically by base_p type, which is pointer to base class. Thus size = 0 is passed as function argument */ base_p->resize(); /* polymorphism: calling derived class member function however with base member function default value 0 --- size 0 */ return 0; } #if 0 The following shows the outputs: 17 virtual void Base::resize(int) size 0 24 virtual void Derived::resize(int) size 3 24 virtual void Derived::resize(int) size 0 #endif