2010-10-26 6 views
7

मैंने इस प्रश्न के बारे में अलग-अलग राय पढ़ीं। मान लें कि मेरे पास शुद्ध वर्चुअल विधियों के समूह के साथ एक इंटरफेस क्लास है। मैं उन तरीकों को उन वर्गों में लागू करता हूं जो इंटरफ़ेस लागू करते हैं और मैं कार्यान्वयन से प्राप्त होने की अपेक्षा नहीं करता हूं।क्या इंटरफ़ेस क्लास के शुद्ध वर्चुअल विधियों को लागू करने वाले तरीकों को आभासी घोषित किया जाना चाहिए?

क्या कार्यान्वयन में तरीकों को वर्चुअल के रूप में घोषित करने की आवश्यकता है? यदि हां, क्यों?

उत्तर

8

नहीं - हर कार्य विधि आधार वर्ग में आभासी घोषित सभी व्युत्पन्न वर्ग में आभासी हो जाएगा

लेकिन अच्छी कोडिंग प्रथाओं उन तरीकों आभासी घोषित करने के लिए कह रहे हैं

7

वास्तविक आवश्यकता - नहीं। एक बार विधि को बेस क्लास में वर्चुअल के रूप में घोषित किया जाता है, यह सभी व्युत्पन्न कक्षाओं के लिए वर्चुअल रहता है। लेकिन यह जानना अच्छा है कि कौन सी विधि वर्चुअल है और कौन सा नहीं, बेस क्लास में इसकी जांच करने के बजाय। साथ ही, ज्यादातर मामलों में, आप सुनिश्चित नहीं हो सकते हैं, अगर आपका कोड व्युत्पन्न होगा या नहीं (उदाहरण के लिए, यदि आप कुछ फर्म के लिए कुछ सॉफ्टवेयर विकसित कर रहे हैं)। जैसा कि मैंने कहा, यह एक समस्या नहीं है, के रूप में एक बार आभासी रूप में घोषित किया है, यह आभासी रहता है, लेकिन सिर्फ मामले में .. (:।

1

आप एक वर्ग से निकाले जाते हैं कभी नहीं तो वहाँ कोई आभासी अपने तरीकों बनाने बिंदु है

+3

जब तक कि यह लाइब्रेरी के कुछ हिस्से के रूप में उपयोग नहीं किया जा रहा है। –

7

virtual व्युत्पन्न वर्ग ओवरराइड घोषणा में वैकल्पिक है।। , लेकिन स्पष्टता के लिए मैं व्यक्तिगत रूप से इसे शामिल करता हूं।

5

उन्हें वर्चुअल चिह्नित करने की कोई आवश्यकता नहीं है।

मैं यह तर्क दूंगा कि वर्चुअल विज्ञापन उन पाठकों को विज्ञापित करता है जिन्हें आप व्युत्पन्न कक्षाओं को कुछ उपयोगी करने के लिए आभासी ओवरराइड करने की अपेक्षा करते हैं। यदि आप वर्चुअल को कुछ करने के लिए कार्यान्वित कर रहे हैं, तो वर्चुअल विधि के पास आपकी कक्षा की तरह की चीज़ों के साथ कुछ भी नहीं हो सकता है: जिस स्थिति में इसे आभासी चिह्नित करना मूर्खतापूर्ण है। पर विचार करें:

class CommsObject { 
    virtual OnConnect(); 
    virtual OnRawBytesIn(); 
}; 

class XMLStream : public CommsObject { 
    virtual OnConnect(); 
      OnRawBytesIn(); 
    virtual OnXMLData(); 
}; 

कि उदाहरण में, OnConnect दोनों वर्गों में आभासी के रूप में दस्तावेज है क्योंकि यह भावना है कि एक वंशज हमेशा जानना चाहते हो बनाता है। OnRawBytesIn XMLStream से "निर्यात" को समझ में नहीं आता है क्योंकि यह कच्चे बाइट को संभालने के लिए उपयोग करता है, और पार्स किए गए डेटा उत्पन्न करता है - जो इसे OnXMLData() के माध्यम से सूचित करता है।

ऐसा करने के बाद, मैं तर्क दूंगा कि एक्सएमएलस्ट्रीम को देखते हुए तीसरी कक्षा के रखरखाव को लगता है कि यह अपने स्वयं के ऑनरॉइट्स फ़ंक्शन बनाने के लिए "सुरक्षित" होगा और इसे सामान्य ओवरलोडेड के रूप में काम करने की उम्मीद है फ़ंक्शन - यानी बेस क्लास आंतरिक सही एक को कॉल करेगा, और बाहरी एक आंतरिक ऑनरॉइट्स को मुखौटा करेगा।

इसलिए वर्चुअल को छोड़कर कक्षा के उपभोक्ताओं से महत्वपूर्ण जानकारी छिपी है और कोड अप्रत्याशित तरीके से व्यवहार करता है।

तो ive पूर्ण सर्कल चला गया: इसे फ़ंक्शन के इच्छित उद्देश्य के बारे में संकेत के रूप में उपयोग करने का प्रयास न करें - इसे फ़ंक्शन के व्यवहार के बारे में संकेत के रूप में उपयोग करें: मार्क वर्चुअल लगातार वर्चस्ट्रीम प्रोग्रामर को वर्चुअल यह जानने के लिए कम फ़ाइलों को पढ़ें कि ओवरराइड होने पर फ़ंक्शन कैसे व्यवहार करेगा।

4

नहीं, इसकी आवश्यकता नहीं है और यह किसी भी कोडिंग त्रुटियों को रोकता नहीं है हालांकि कई कोडर इसे रखना पसंद करते हैं।

एक बार सी ++ 0x मुख्यधारा बन जाता है तो आप इसके बजाय override विनिर्देशक का उपयोग करने में सक्षम होंगे।

2

एक बार 'आभासी', यह आखिरी बच्चे के लिए आभासी है।अफैक, यह सी ++ की विशेषता है।

संबंधित मुद्दे

 संबंधित मुद्दे