2013-09-07 23 views
12

के प्रकार के साथ फ़ंक्शन पैरामीटर प्रकार को ओवरराइड करें, मैं एक विधि के साथ एक इंटरफेस (बजाय सी ++ में वर्चुअल बेस क्लास) बनाने की योजना बना रहा हूं जो स्वयं के प्रकार का तर्क लेता है।व्युत्पन्न वर्ग

class Base { 
public: 
    virtual void seriousMethod(const Base &arg) = 0; 
} 

व्युत्पन्न वर्ग को बेस क्लास प्रकार का कोई तर्क नहीं लेना चाहिए, लेकिन व्युत्पन्न वर्ग प्रकार का।

class Derived: public Base { 
public: 
    virtual void seriousMethod(const Derived &arg) { /* ... */ } 
} 

मुझे यह कैसे पता चलेगा? क्या मुझे बेस क्लास टेम्पलेट करना होगा (उदा। Base<Derived>) या क्या क्लीनर समाधान है?

+0

बिंदु पर और अधिक - यह करने के लिए प्रेरणा क्या है? –

+0

"व्युत्पन्न वर्ग को बेस क्लास प्रकार का कोई तर्क नहीं लेना चाहिए, लेकिन व्युत्पन्न वर्ग प्रकार का" - वर्चुअल विधियों में क्या बात है? – berak

+0

@EdHeal विशिष्ट होने के लिए, एक ए-स्टार सर्च जेनेरिक नोड क्लास जिसे व्युत्पन्न कार्यान्वयन द्वारा निर्दिष्ट किया जाना है। – Appleshell

उत्तर

13

आप इसे सीधे नहीं कर सकते हैं। इस मामले के बारे में सोचो:

Base b; 
Derived d; 
Base& d_ref = d; 
d_ref.seriousMethod(b); // What happens here? 

संकलन समय में चर d_ref स्थिर प्रकार Base है, तो Base की परिभाषा के अनुसार, यह seriousMethod को पैरामीटर के रूप b लेने के लिए सक्षम होना चाहिए।

लेकिन रनटाइम पर, d_ref के गतिशील प्रकार, Derived है, इसलिए यह Derived की परिभाषा के अनुसार, यह नहीं bseriousMethod को पैरामीटर के रूप ले सकता है। यह b को Dervied में परिवर्तित नहीं कर सकता है क्योंकि यह सीधे Base ऑब्जेक्ट (यदि Base सार नहीं है) हो सकता है, या यह Base से प्राप्त कुछ अन्य वर्ग हो सकता है जो Derived जैसा नहीं है।

आप यह सोचते हैं कि दिलचस्प आवर्ती टेम्पलेट पैटर्न, यानी templating Base है इस बारे में जाने के लिए केवल असली तरीका और के रूप में Dervied को परिभाषित करने में सही कर रहे हैं:

class Derived : public Base<Derived> { ... } 

इस को हटा समस्या ऊपर दिखाया गया है, प्रत्येक क्योंकि Base<T> से व्युत्पन्न प्रकार का एक अलग आधार वर्ग होगा, और विरासत के माध्यम से एक दूसरे से संबंधित नहीं होगा।

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