2012-08-06 9 views
12

मैं जानना चाहता था कि क्यों सी ++ पैरामीटर में सह-भिन्नता का समर्थन नहीं करता है जैसे कि नीचे उदाहरण में या यदि इसे प्राप्त करने का कोई तरीका है?पैरामीटर में C++ covariance

class base { 
public: 
virtual base* func(base * ptr) { return new base(); } 
}; 

class derived : public base { 
public: 
virtual derived* func(derived * ptr) override { return new derived(); } //not allowed 
}; 
+3

एक और दिलचस्प सवाल यह होगा कि तर्कों पर अनुबंध-भिन्नता क्यों समर्थित नहीं है। –

उत्तर

10

वापसी प्रकार base से derived inherits के बाद से की अनुमति है, लेकिन समारोह पैरामीटर काम नहीं कर सकता - नहीं सभी base उदाहरणों एक derived भी किया जाएगा। उन मामलों में क्या होना चाहिए जहां func को base पर एक पॉइंटर पर derived नहीं है? सबसे व्युत्पन्न कार्यान्वयन कॉल करने योग्य नहीं है।

+6

जो लिस्कोव प्रतिस्थापन सिद्धांत का उल्लंघन करता है। –

+0

क्या कोई कामकाज है? जावा/सी # में आप केवल एक कास्ट का उपयोग कर सकते हैं लेकिन सी ++ में, आपकी ऑब्जेक्ट काटा जाएगा। – Winter

+0

@ विंटर जब तक आप मूल्य से गुजरते हैं तब तक कोई स्लाइसिंग नहीं होती है (और मूल्य से गुजरना पॉलिमॉर्फिक फ़ंक्शंस के साथ अजीब होगा जो यहां प्रश्न है)। पॉइंटर द्वारा पास (प्रश्न में) या संदर्भ/shared_ptr/unique_ptr सभी काम करेंगे और बिना किसी अन्य ओओ भाषा के किसी भी टुकड़े किए जा सकते हैं। एकमात्र सवाल यह है कि सुरक्षा की गारंटी देने के लिए उपयोग किया जाता है और आपके प्रकार के पदानुक्रम को फिट करता है जो या तो गतिशील_कास्ट या स्टेटिक_कास्ट के बीच किसी विकल्प के लिए उबाल जाता है और उपयोगकर्ताओं को आपके द्वारा लगाए गए अनचाहे अनुबंध को तोड़ने के लिए एक कठोर चेतावनी नहीं देता है। संभवतः आप अपने डिजाइन निर्णयों पर फिर से विचार करना चाहते हैं। – Flexo

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