Quesition on C++ polymorphism usage -
# शामिल है & lt; iostream & gt; वर्ग आधार {सार्वजनिक: आभासी शून्य रन () {}; संरक्षित: ~ बेस () {std :: cout & lt; & lt; "बेस के लिए डिस्ट्रिक्टर" & lt; & lt; std :: endl;}; }; वर्ग व्युत्पन्न: सार्वजनिक आधार {सार्वजनिक: शून्य चला () {}; ~ व्युत्पन्न () {std :: cout & lt; & lt; "व्युत्पन्न के लिए विध्वंसक" & lt; & lt; std :: endl;}; }; शून्य get_type (std :: shared_ptr & lt; बेस & gt; बी) {b.reset (नया व्युत्पन्न); Std :: cout & lt; & lt; "get_type के अंत" & lt; & lt; std :: endl; } Int main () {std :: shared_ptr & lt; base & gt; ख; Get_type (b); Std :: cout & lt; & lt; "get_type से बाहर" & lt; & lt; std :: endl; बी & gt; रन (); }
यह ठीक संकलित करता है लेकिन मुझे विभाजन त्रुटि मिली। मैं देख रहा हूँ कि क्या हो रहा है और आउटपुट है
get_type सेगमेंटेशन गलती से बाहर के आधार के लिए व्युत्पन्न डिस्ट्रक्टर के लिए get_type डिस्ट्रक्टर का अंत: 11
यह get_type में जाता है और इसके प्रकार को आवंटित करता है हालांकि, इस समारोह के दायरे से परे यह स्वतः प्रकार फिर से नष्ट कर देता है तब, क्योंकि यह बी-> रन () नहीं मिल सकता है, यह सीग दोष देता है किसी को भी यह कैसे काम करना जानता है? मुझे समान प्रश्न नहीं मिल रहा है क्षमा करें यदि यह संभव दोहराव है।
आपका get_type ()
फ़ंक्शन को प्राप्त होता है अपने मुख्य
फ़ंक्शन में परिभाषित Shared_ptr की कॉपी करें यह तब इस प्रति के लिए एक मान प्रदान करता है और रिटर्न देता है। get_type
फ़ंक्शन को छोड़ते समय, प्रतिलिपि इसके सूचक को सामान्य रूप में निर्दिष्ट करता है उसके बाद आपके मुख्य
फ़ंक्शन में, प्रारंभिक साझा किया गया आईपीटीआर अभी भी अनअसाइन किया गया है और स्पष्ट रूप से आप इसे एक कोडबद्धता गलती प्राप्त करते हैं जब इसे dereference की कोशिश कर रहा है तो इसे run
विधि कॉल करने के लिए।
get_type फ़ंक्शन में share_ptr के लिए एक गैर-कॉन्स्ट संदर्भ पूछना चाहिए।
PS: जैसा कि अन्य लोगों ने बताया, आप जरूरी अपने मूल वर्ग वर्चुअल के नाशक को बनाते हैं।
Comments
Post a Comment