c++ - virtual function, -> operator, inheritance SO CONFUSING -


ठीक है यह एक सरल उदाहरण है जो मुझे बहुत भ्रमित करता है ...

  class first {सार्वजनिक: शून्य फ़ंक्शन (cout & lt; & lt; "फर्स्टफ़न्क";}}; कक्षा द्वितीय: सार्वजनिक पहले {सार्वजनिक: शून्य फ़ंक्शन (cout & lt; & lt; "secondfunc";}}; कक्षा तीसरा: सार्वजनिक द्वितीय {सार्वजनिक: शून्य फ़नक () {cout & lt; & lt; "थर्डफंक";}}; Int main () {तीसरे * तीसरे पटर = नया तीसरा (); दूसरा * सेकंडप्ट्रर = तीसरापन; प्रथम * firstptr = secondptr; firstptr- & gt; समारोह (); // बाहर प्रिंट करता है FirstFunc secondptr-> फ़ंक्शन (); // बाहर प्रिंट करता है SecondFunc thirdptr- & gt; फ़नक (); // तीसरे संस्करण को प्रिंट करता है;   

और यह आभासी फ़ंक्शन के साथ है

  class प्रथम {सार्वजनिक: वर्चुअल शून्य फ़नक () {cout & lt; & lt; "FirstFunc";}}; कक्षा द्वितीय: सार्वजनिक पहले {सार्वजनिक: वर्चुअल शून्य फ़नक () {cout & lt; & lt; "सेकंडफंक";}}; वर्ग तीसरा: सार्वजनिक द्वितीय {सार्वजनिक: वर्चुअल शून्य फ़नक () {cout & lt; & lt; "थर्डफंक";}}; Int main () {तीसरे * तीसरे पटर = नया तीसरा (); दूसरा * सेकंडप्ट्रर = तीसरापन; प्रथम * firstptr = secondptr; firstptr- & gt; समारोह (); // प्रिंट आउट तृतीयफ़ंक्शन secondptr- & gt; फ़नक (); // प्रिंट आउट तृतीयफ़ंक्शन तीसरेप्रति- & gt; फ़नक (); // तीसरे संस्करण को प्रिंट करता है;   

ठीक है, यह मेरा सवाल है।

  1. मैं तीसरे तीसरे पटकथा = नया तीसरा कैसे पढ़ूं? नया आंतों के लिए एक स्मृति को "नए int" पर आवंटित करता है, लेकिन मेरे पास कोई संकेत नहीं है कि मुझे नया थर्ड () पढ़ने का क्या मतलब है; क्योंकि यह कंस्ट्रक्टर है

  2. दूसरा * secondptr = thirdptr; / प्रथम * firstptr = secondptr; उन दो बयानों इतनी भ्रामक हैं क्या किसी ने इसे & amp; ऑपरेटर या ऑपरेटर को संबोधित करने के लिए संबंधित आसान शब्द? मैं इस सूचक और विरासत की अवधारणा को समझता हूं, लेकिन यह हिस्सा बहुत भ्रमित है।

  3. मुझे दूसरे उदाहरण से परिणाम कैसे प्राप्त करना चाहिए? मैं पढ़ने वाली किताब कह रहा हूं

    पहले उदाहरण के लिए // सी + + कंपाइलर पॉइंटर अंकगणितीय ऑपरेशन के बारे में, एक निर्णय बनाता है / सूचक के प्रकार के आधार पर, किस पर नहीं संकेतक वास्तव में

    को दूसरे उदाहरण के लिए इशारा कर रहा है उदाहरण के लिए / / आभासी फंक्शन: पॉइंटर प्रकार // के आधार पर तय नहीं है, पॉइंटर वास्तव में इंगित करता है कि उस पर आधारित कॉल करने के लिए

    यह अनुवाद है, अतः सटीक नहीं हो सकता, लेकिन अभी भी समझ में नहीं आ सकता है। अगर आप मेरी मदद कर सकते हैं तो मुझे इसकी खुशी होगी!

    1. नया तीसरा () दो बातें करता है सबसे पहले यह तीसरे ऑब्जेक्ट के लिए स्मृति आवंटित करता है और फिर यह कन्स्ट्रक्टर को तीसरे पर कॉल करता है आप दो हिस्सों में होने वाले कथन के बारे में सोच सकते हैं, नया तीसरा आवंटन स्मृति और () कन्स्ट्रक्टर को कॉल करता है

    2. द्वितीय * सेकंडप्टर = तीसरापन; / प्रथम * firstptr = secondptr; सभी तीन चर एक ही सूचक को सौंपे गए हैं मान लीजिए कि thritptr बराबर है 100. फिर दोनों secondptr और firstptr इन स्टेटस के अंत में 100 के बराबर होंगे। सभी तीन पॉइंटर्स स्मृति में एक ही पते पर इंगित करते हैं। हालांकि, जब से वे अलग-अलग प्रकार के होते हैं, तो कम्पाइलर उन्हें अलग-अलग रीसेट करता है

    3. गैर-वर्चुअल फ़ंक्शंस के लिए विधि कॉल को संकलन समय पर हल किया जाता है, चर के प्रकार के आधार पर। इसलिए जब पहले कोड firstptr को संकलित किया जाता है तो पहले * होता है, तो कंपाइलर कॉल करने के लिए प्रथम :: Func () करता है। वर्चुअल फ़ंक्शन के लिए, विधि कॉल पूरी तरह से रन टाइम तक हल नहीं होता है कंपाइलर कोड उत्पन्न करता है जो वास्तविक प्रकार को निर्धारित करेगा जो उस चर को इंगित करेगा और उस फ़ंक्शन को कॉल करेगा। दूसरे उदाहरण में, जब कार्यक्रम चलता है, firstpr-> फ़ंक () पहले यह निर्धारित करता है कि firstptr वास्तव में एक thrird ऑब्जेक्ट को इंगित करता है, इसलिए इसे तीसरा :: फ़नक () कॉल करता है। यह आमतौर पर ए के प्रयोग से किया जाता है।

Comments

Popular posts from this blog

excel vba - How to delete Solver(SOLVER.XLAM) code -

github - Teamcity & Git - PR merge builds - anyway to get HEAD commit hash? -

ios - Replace text in UITextView run slowly -