सी ++ में hiding rule के पीछे तर्क क्या है?सी ++: छिपाने के नियम के पीछे तर्क
class A { void f(int); }
class B : public A { void f(double); } // B::f(int) is hidden
यदि यह एक सार्थक सुविधा मुझे लगता है कि यह भी एक ही नाम के साथ नए कार्यों को परिभाषित करने के बिना कार्यों को छिपाने के लिए संभव हो जाना चाहिए है: कुछ इस तरह:
class B : public A { hide void f(double); }
लेकिन यह नहीं है मुमकिन।
मैं इसे compilers काम सरल नहीं लगता कि, के बाद से compilers वैसे भी प्रकट करें कार्यों में सक्षम होना चाहिए जब आप स्पष्ट रूप से
using
निर्देश का उपयोग करें:class B : public A { using A::f; void f(double); } // B::f(int) NOT hidden
तो, कैसे आना है एक छुपा नियम?
हम, सभी तीन उत्तरों अच्छे लगते हैं, और छुपा नियम के लिए अलग तर्कसंगत दिखाते हैं। मुझे यकीन नहीं है कि मुझे किस उत्तर को स्वीकार करना चाहिए।
हालांकि निर्णय कंपाइलर लेखकों के जीवन को आसान बनाने पर आधारित नहीं था, यह तर्क कि संकलक को अभी भी अनदेखा करने की आवश्यकता है, वह अमान्य है। जब संकलक कक्षा के उपयोग के साथ कक्षा को पार करता है, तो यह कक्षा के स्मृति प्रतिनिधित्व में सभी 'ए :: एफ' लाता है। जब यह किसी कॉल को हल करने का प्रयास करता है, तब तक इसे केवल तब तक वापस जाना होगा जब तक यह पहचानकर्ता की पहली घटना न हो जाए। सभी संभव पहचानकर्ताओं को दायरे में लाने के लिए संभावित रूप से कई पथों पर वापस जाने की आवश्यकता नहीं है। वही तथ्य यह है कि एक सदस्य विधि नामस्थान स्तर फ़ंक्शन को छुपाएगी ... –
AFAIK, * नए कार्यों को परिभाषित किए बिना छुपा * * + delete' के माध्यम से C++ 11 में संभव है। – Walter
बेस क्लास कार्यों को छिपाने के लिए _is_ एक तंत्र है। 'कक्षा ए' के बजाय 'कक्षा ए: संरक्षित बी {...};' का उपयोग करें। एक मृत घोड़े को मारने के लिए खेद है। –