मेरे पास एक क्लास टेम्पलेट है जहां कुछ विधियों को वर्चुअल के रूप में परिभाषित किया जाता है ताकि वे मेरी कक्षा के उपयोगकर्ता को उनके व्युत्पन्न वर्ग में कार्यान्वयन कर सकें। ध्यान दें कि मेरे टेम्पलेट वर्ग में कुछ गैर-आभासी विधियां हैं जो वर्चुअल एक का उपयोग करती हैं (एक वर्चुअल क्लास जिसे मान वापस करना चाहिए गैर-आभासी वर्ग में कहा जाता है)।सी ++ आभासी विधि ओवरराइड
क्या आप मुझे एक सही कोड का एक सरल उदाहरण दे सकते हैं जहां मूल वर्ग की आभासी विधि को एक मूल्य वापस करना चाहिए (लेकिन यह कार्यान्वयन बाल वर्ग में प्रदान किया जाता है) और मूल वर्ग में वर्चुअल विधि द्वारा लौटाया गया मान उस वर्ग के अन्य तरीकों में प्रयोग किया जाता है। क्योंकि मैंने कहीं देखा (उदाहरण के लिए यहां: Safely override C++ virtual functions) इससे कुछ समस्याएं हो सकती हैं और उपयोगकर्ता परिभाषित विधि अभिभावक वर्ग की वर्चुअल विधि को ओवरराइड कर देगी।
नोट: मैं g ++ कंपाइलर का उपयोग कर कोड :: ब्लॉक के साथ प्रोग्राम।
संपादित करें:)
template<typename T>
class parent {
public:
// Public methods that user can call
int getSomething(T t);
void putSomething(T t, int x);
// public method that user should implement in his code
virtual float compute(T t) { }
// protected or private methods and attributes used internally by putSomething ...
float doComplexeThings(...); // this can call
};
विधि गणना (उपयोगकर्ता (बच्चे वर्ग) द्वारा लागू किया जाना चाहिए: यहाँ मैं क्या चाहते का एक सरल उदाहरण अनुरोध किया। हालांकि, उदाहरण के लिए putSomething() और doComplexeThings() द्वारा इस विधि गणना() को बुलाया जाता है।
जो आप वर्णन करते हैं, उसके लिए वर्चुअल विधि की आवश्यकता नहीं हो सकती है (स्थैतिक बहुरूपता आपके लिए काम कर सकती है) - आपके विवरण से बताना मुश्किल है। कृपया आपके द्वारा लिखे गए नमूना कोड को पोस्ट करें ताकि हमारे पास वास्तव में एक बेहतर अर्थ हो जो आप करने की कोशिश कर रहे हैं। – kfmfe04
लिंक किए गए प्रश्न में उदाहरण एक ओवरराइड है जो आपको लगता है कि वास्तव में एक त्रुटि के कारण अधिभार घोषित करता है, उदाहरण के लिए एक कॉन्स गायब है और वापसी मूल्यों के बारे में नहीं था। आपको क्या लगता है खतरे है, बिल्कुल? – CashCow
क्लासिक टेम्पलेट कोड में, आपको 'वर्चुअल फ्लोट कंप्यूट (टी टी)' घोषित करने की भी आवश्यकता नहीं है। यदि आप उदाहरण के लिए हैंडल करते हैं, तो आप इसे 't.compute()' के माध्यम से putSomething() और doComplexeThings() के अंदर बस (इसे कॉल करें) का उपयोग करें। यदि आपकी कक्षा टी गणना लागू नहीं करती है तो संकलक त्रुटि देगा। इस तरह, माता-पिता और टी को वास्तव में एक ही विरासत पदानुक्रम में भी रहना नहीं पड़ता है: यानी, टी माता-पिता के रिश्ते का एक बच्चा आवश्यक नहीं है। ऐसा करने से आपको माता-पिता को एक और सार्थक नाम देने का मौका मिल सकता है (क्योंकि यह संबंध आवश्यक नहीं है)। – kfmfe04