आपने कोई भाषा निर्दिष्ट नहीं की है।
C ++ में एक वर्चुअल फ़ंक्शन को कॉल करते समय एक कंस्ट्रक्टर को सावधान रहना चाहिए, उस वास्तविक फ़ंक्शन को कॉल करना क्लास कार्यान्वयन है। यदि यह एक कार्यान्वयन के बिना एक शुद्ध आभासी विधि है, तो यह एक एक्सेस उल्लंघन होगा।
एक निर्माता गैर-आभासी कार्यों को कॉल कर सकता है।
यदि आपकी भाषा जावा है जहाँ फ़ंक्शन आम तौर पर डिफ़ॉल्ट रूप से आभासी होते हैं तो यह समझ में आता है कि आपको अतिरिक्त सावधानी बरतनी होगी।
C # उस स्थिति को संभालने के लिए लगता है जिस तरह से आप अपेक्षा करते हैं: आप निर्माणकर्ताओं में आभासी तरीकों को कॉल कर सकते हैं और यह सबसे अंतिम संस्करण कहता है। इसलिए C # में एंटी-पैटर्न नहीं।
कंस्ट्रक्टरों से कॉल करने के तरीकों का एक सामान्य कारण यह है कि आपके पास कई ऐसे कंस्ट्रक्टर हैं जो कॉमन "इनिट" विधि को कॉल करना चाहते हैं।
ध्यान दें कि विध्वंसक वर्चुअल विधियों के साथ एक ही समस्या होगी, इस प्रकार आपके पास एक वर्चुअल "क्लीनअप" विधि नहीं हो सकती है जो आपके विध्वंसक के बाहर बैठता है और यह बेस-क्लास डिस्ट्रक्टर द्वारा कॉल करने की अपेक्षा करता है।
जावा और सी # में विध्वंसक नहीं हैं, उनके पास अंतिम रूप हैं। मैं जावा के साथ व्यवहार नहीं जानता।
सी # इस संबंध में सफाई को सही ढंग से संभालने के लिए प्रकट होता है।
(ध्यान दें कि हालांकि जावा और C # में कचरा संग्रह है, जो केवल मेमोरी आवंटन का प्रबंधन करता है। अन्य सफाई है कि आपके विनाशकर्ता को ऐसा करने की आवश्यकता है जो मेमोरी को रिलीज़ नहीं कर रहा है)।