नहीं, सभी विनाशक डिफ़ॉल्ट रूप से आभासी नहीं हैं।
आप सभी आधार वर्ग
इसके अलावा पर एक आभासी नाशक को परिभाषित करने की आवश्यकता होगी।
The C++ language standard is unusually clear on this topic. When you try to delete a derived class object through a base class pointer and the base class has a non-virtual destructor (as EnemyTarget does), the results are undefined
व्यवहार में, यह आमतौर पर एक अच्छा विचार है अगर आपको लगता है कि किसी को अंततः एक व्युत्पन्न वर्ग बना सकता है एक आभासी नाशक के साथ एक वर्ग को परिभाषित करने के लिए है:
अपनी पुस्तक "प्रभावी सी ++" में स्कॉट Meyers के शब्दों में इसमें से। मैं बस सभी वर्गों को आभासी विनाशक बना देता हूं। हां, इसके साथ जुड़ी एक लागत है, लेकिन इसे वर्चुअल बनाने की लागत अक्सर अधिक नहीं होती है, जो रन-टाइम ओवरहेड के बराबर वजन का वजन नहीं करती है।
मेरा सुझाव है, केवल यह गैर-आभासी बनाओ जब आप पूरी तरह से निश्चित हैं कि आप डिफ़ॉल्ट गैर-आभासी पर भरोसा करने के बजाए इसे इस तरह से चाहते हैं कि संकलक लागू होते हैं। आप असहमत हो सकते हैं, हालांकि (संक्षेप में) मैंने हाल ही में कुछ विरासत कोड पर एक भयंकर स्मृति रिसाव किया था, जहां मैंने जो कुछ किया था, वह कई वर्षों तक मौजूद वर्गों में से एक में std :: वेक्टर जोड़ रहा था। यह पता चला है कि इसके मूल वर्गों में से एक में विनाशक परिभाषित नहीं था (डिफ़ॉल्ट विनाशक खाली, गैर-आभासी है!) और उस बिंदु तक कोई स्मृति लीक होने से पहले इस तरह की कोई स्मृति आवंटित नहीं की जा रही थी। कई दिनों की जांच और समय बाद में बर्बाद हो गया ...
वैसे, बस सोच रहा है, एक डिफ़ॉल्ट विनाशक क्या है? क्या एक और प्रकार का विनाशक है? – user88637
@ yossi1981: यदि आप कक्षा में विनाशक घोषित नहीं करते हैं, तो संकलक आपके लिए एक सम्मिलित करता है। कुछ असामान्य मामले के बारे में गलत होने के जोखिम पर, यह "डिफ़ॉल्ट विनाशक" वैसा ही है जैसा आपने "~ MyClass() {}" परिभाषित किया था। –
@onebyone: सटीक होना: 'सार्वजनिक: ~ MyClass() {}' - भले ही कक्षा के सदस्य डिफ़ॉल्ट रूप से निजी हों। – MSalters