"मेरे पास वर्चुअल बेस क्लास फ़ंक्शन है जिसका उपयोग किसी विशेष व्युत्पन्न वर्ग में कभी नहीं किया जाना चाहिए।"
कुछ मामलों में यह एक विरोधाभास है। वर्चुअल फ़ंक्शंस का पूरा बिंदु बेस क्लास द्वारा प्रदान किए गए अनुबंध के विभिन्न कार्यान्वयन प्रदान करना है। आप जो करने की कोशिश कर रहे हैं वह अनुबंध तोड़ना है। सी ++ भाषा आपको ऐसा करने से रोकने के लिए डिज़ाइन की गई है। यही कारण है कि जब आप किसी ऑब्जेक्ट को तुरंत चालू करते हैं तो यह आपको शुद्ध वर्चुअल फ़ंक्शंस को लागू करने के लिए मजबूर करता है। और यही कारण है कि यह आपको अनुबंध का हिस्सा हटाने नहीं देगा।
क्या हो रहा है अच्छी बात है। यह शायद आपको एक अनुचित डिजाइन विकल्प को लागू करने से रोक रहा है।
हालांकि :
कभी कभी यह एक खाली कार्यान्वयन करता है करने के लिए उपयुक्त हो सकता है कुछ भी नहीं:
void MyClass::my_virtual_function()
{
// nothing here
}
या एक खाली कार्यान्वयन कि रिटर्न एक "विफल" की स्थिति:
bool MyClass::my_virtual_function()
{
return false;
}
यह सब निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं। शायद अगर आप किसी और को प्राप्त करने की कोशिश कर रहे हैं, तो आपको अधिक जानकारी दे सकती है जो आपको सही दिशा में इंगित कर सकती है।
संपादित
आप इसके बारे में सोचते हैं, तो एक विशिष्ट व्युत्पन्न प्रकार के लिए फ़ंक्शन को कॉल से बचने के लिए, फोन करने वाले को पता है कि वह किस प्रकार बुला रहा है की आवश्यकता होगी। बेस क्लास संदर्भ/पॉइंटर को कॉल करने का पूरा बिंदु यह है कि आप नहीं जानते कि किस व्युत्पन्न प्रकार को कॉल प्राप्त होगा।
यह कैसे संभव है? क्या आप 'डी * डी = नई डी() में कंपाइलर त्रुटि चाहते हैं; static_cast (डी) -> एफ() '? –
@ ब्रायन चेन यदि इसे बेस क्लास में पॉइंटर पर डाला जाता है तो इसे बेस क्लास के पॉइंटर की तरह कार्य करना चाहिए - जिस स्थिति में 'D :: f' अभी भी कॉल किया जाएगा, हां। –
और उस मामले में आप किस व्यवहार की अपेक्षा करेंगे? – Theolodis