मुझे लगता है कि उच्च बिंदु से यह public
विरासत होना चाहिए। इसे private
बनाने के कारण पूरी तरह से तकनीकी हैं।
क्यों? क्योंकि कोई प्रकार कॉपी करने योग्य है या नहीं (और यह boost::noncopyable
से विरासत में दिखाया गया है) सार्वजनिक इंटरफ़ेस का हिस्सा है। उदाहरण के लिए यदि विरासत public
होगी, तो आप boost::noncopyable
से प्राप्त होने वाले प्रकार को जांचने में सक्षम होंगे (फिर "मेटा प्रोग्रामिंग" का उपयोग करके) और उसके बाद इसका कारण कॉपी करने योग्य है या नहीं।
निकोलाई एन Fetissov in his answer to this question बताते हैं कि boost::noncopyable
virtual
नाशक नहीं है और इसलिए public
आधार वर्ग के रूप में नहीं किया जाना चाहिए। हालांकि यह सामान्य रूप से एक वैध तर्क है, मुझे लगता है कि यह इतना असंभव है कि कोई भी कभी भी boost::noncopyable
पर एक ऑब्जेक्ट द्वारा एक ऑब्जेक्ट (और delete
) का उपयोग करने का प्रयास करेगा, जो तर्क (इस विशेष मामले में) पूरी तरह अकादमिक बनाता है।
चलो! अगर कोई कोड का दुरुपयोग करने के इच्छुक है कि वह को boost::noncopyable
पर पॉइंटर पर उपयोग करता है तो सुरक्षित होने का कोई तरीका नहीं है। निश्चित रूप से आप इसे थोड़ा कठिन बना सकते हैं लेकिन एक प्रोग्रामर इतना निर्धारित है कि वैसे भी कोड का दुरुपयोग करने का कोई और तरीका मिलेगा।
इसके अलावा उस में सी ++ 11 boost::noncopyable
कि लगता है की घोषणा के द्वारा कि इस मुद्दे का समाधान कर सकता default
protected
नाशक:
protected:
~noncopyable() = default;
इस तरह नाशक की घोषणा करते हुए (क्योंकि हम इसे default
बनाया) के बिना किसी अतिरिक्त शुल्क नहीं होनी चाहिए हम delete
से boost::noncopyable
पर पॉइंटर पर से सुरक्षित हैं।
दूसरी ओर हालांकि यह भी असंभव लगता है कि कोई भी यह जांचने के लिए तैयार होगा कि boost::noncopyable
से विरासत की जांच करके कोई प्रकार कॉपी करने योग्य है या नहीं। अधिकतर क्योंकि यह पूर्ण उत्तर प्रदान नहीं करता है। सिर्फ इसलिए कि boost::noncopyable
से कोई प्रकार नहीं निकला है इसका मतलब यह नहीं है कि यह कॉपी करने योग्य है।
ध्यान दें कि Boost.Noncopyable docsprivate
विरासत का उपयोग करने का सुझाव देता है।
स्रोत
2014-11-06 09:46:26
मैं हमेशा करता हूं: 'कक्षा Foo: boost :: noncopyable' :) – UncleBens