2010-09-01 21 views
18

तो, मुझे आज यह उद्धरण मिला, क्या कोई समझा सकता है?सी ++, संरक्षित अमूर्त वर्चुअल बेस शुद्ध आभासी निजी विनाशक

"अगर आपको लगता है सी ++ ज्यादा जटिल नहीं है, बस क्या एक संरक्षित सार आभासी आधार शुद्ध वर्चुअल प्राइवेट नाशक है और जब पिछली बार जब आप एक जरूरी था - टॉम कारगिल?" मेरा मानना ​​है कि

+6

आई कैन इस "रिडंडेंसी विभाग विभाग" टैग करें? कृप्या? –

+5

ये शब्द समझ में आते हैं लेकिन वास्तव में नहीं। चीजों को जटिल बनाने की कोशिश करने के लिए दो अलग-अलग चीजों को एक साथ जोड़ना एक संकेत है कि लेखक बस लोगों को भ्रमित करने की कोशिश कर रहा है ताकि वह वास्तव में वहां न हो। हमें ध्यान रखना चाहिए कि प्रत्येक स्थिति अद्वितीय है और आप अपनी कक्षा पदानुक्रम और विनाशकों को स्थिति के अनुसार आवश्यक बनाते हैं। भाषा को अधूरा कॉल करना क्योंकि यह सुविधा प्रदान करता है मूर्खतापूर्ण है। यह कहने की तरह निजी विरासत का मुद्दा क्या है। हां आम तौर पर आप इसका उपयोग नहीं करेंगे, लेकिन ऐसा होने का अवसर होगा जब यह अच्छा लगेगा। –

+2

मैं 'संरक्षित सार वर्चुअल बेस शुद्ध वर्चुअल प्राइवेट डिस्ट्रक्टर' के बारे में नहीं सोचता और आखिरी बार आपको एक की आवश्यकता कब थी। मुझे लगता है 1) मेरी कक्षा सार है 2) विनाशक आभासी होना है। 3) लेकिन मुझे कार्यान्वयन की आवश्यकता नहीं है इसलिए इसकी शुद्ध 3) मैं संरक्षित विरासत का उपयोग करूंगा। –

उत्तर

16

यह एक है निजी शुद्ध आभासी विनाशक (मुझे लगता है कि यह हिस्सा स्वयं व्याख्यात्मक है) जो अमूर्त बेस क्लास का हिस्सा है, जिसे आपने संरक्षित आभासी विरासत के माध्यम से उपयोग किया है। ।

class Base 
{ 
    private: 
     virtual ~Base() = 0; /* A */ 
}; 

class Derived : protected virtual Base 
{ 
    private: 
    ~Derived() {.......} /* B */ 
}; 

टैग B की दृष्टि से, टैग A पर लाइन एक "संरक्षित सार आभासी आधार शुद्ध वर्चुअल प्राइवेट नाशक",

उन तीन भागों में से प्रत्येक को व्यक्तिगत रूप से इसके उपयोग किया है। मुझे एक डिजाइन पैटर्न के बारे में पता नहीं है जिसके लिए उपर्युक्त तीनों हिस्सों की आवश्यकता होती है, लेकिन उनके उपयोग को रोकने के लिए कुछ भी नहीं है।

+2

यह एक संकलित त्रुटि है, है ना? क्योंकि वर्चुअल विरासत में, वर्चुअल बेस के लिए विनाशक को सबसे अधिक व्युत्पन्न विनाशक द्वारा बुलाया जाना चाहिए, लेकिन 'व्युत्पन्न()' '' बेस() 'तक पहुंच नहीं है। (एनबी: सिर्फ इसलिए कि '~ बेस()' शुद्ध वर्चुअल * का मतलब यह नहीं है कि कोई शरीर नहीं है।) –

+0

@ बेनोवॉइट: सी ++ _is_ अजीब। इसमें वास्तव में शुद्ध ('= 0') के रूप में घोषित विधियां हो सकती हैं और अभी भी परिभाषा और कॉल करने योग्य है। इस तरह एक विनाशक के साथ वास्तव में क्या होता है क्योंकि यह हमेशा कम से कम स्वत: जेनरेट की गई परिभाषा प्राप्त करता है। –

+0

@ जेम्स कर्रेन: अच्छा जवाब। मुझें यह पसंद है !!! – Destructor

3

मूल संदर्भ के बारे में सुनिश्चित नहीं है, लेकिन मेरा अनुमान है कि कोई दावा करेगा कि सी ++ जावा की तरह कम जटिल है। टॉम का मुद्दा यह है कि सी ++ में पर्याप्त विशेषताएं हैं कि आप आसानी से निर्माण कर सकते हैं जो बहुत जटिल है।

0

असल में, उन्होंने सिर्फ शब्दों का एक गुच्छा फेंक दिया और उन्हें महसूस किए बिना उन्हें एक साथ अटक गया कि वे वास्तव में अलग-अलग चीजों, या अक्सर, वही बात देखते हैं।

protected abstract virtual base 

बहुत आसान।

class Base { // BASE 
    virtual something() = 0; // ABSTRACT 
}; 
class Derived : protected virtual Base { // PROTECTED VIRTUAL 
}; 

शुद्ध वर्चुअल प्राइवेट नाशक

इसके अलावा बहुत सरल।

class Base { // BASE 
private: 
    virtual ~Base() = 0; // pure virtual, private, destructor 
}; 
class Derived : Base { 
}; 

बेशक, शुद्ध आभासी सार के समान ही है।

यह स्पष्ट रूप से पूर्ण है और कुल हाइपरबोले किसी ऐसे व्यक्ति द्वारा लिखा गया है जिसके बारे में कोई बात नहीं है जिसके बारे में वह बात कर रहा है।

+3

मुझे लगता है कि टॉम कारगिल का एक उचित विचार है शब्द का मतलब है। देखें: http://www.amazon.com/C- प्रोग्रामिंग- स्टाइल- टॉम- कारगिल/डीपी/0201563657 – janm

+0

@janm: वह जानता है कि शब्दों का क्या अर्थ है, इसका मतलब यह नहीं है कि उन्होंने उन्हें एक साथ स्ट्रिंग करते समय कोई ख्याल रखा । विशेष रूप से, जिसने चीज को काम करने की कोशिश की है (ब्रितान के उत्तर में उद्धृत प्रसिद्ध स्कॉट मेयर्स समेत) ने अवैध कोड तैयार किया है। यह * काम कर सकता है, लेकिन एक 'मित्र वर्ग' घोषणा की आवश्यकता है। –

2

ये शब्द समझ में आते हैं लेकिन वास्तव में नहीं।

जटिल चीजों को खत्म करने के प्रयास में दो अलग-अलग चीजों को एक साथ जोड़ना एक संकेत है कि लेखक बस लोगों को भ्रमित करने की कोशिश कर रहा है ताकि वह वास्तव में वहां न हो।

हमें ध्यान रखना चाहिए कि प्रत्येक स्थिति अद्वितीय है और आप अपनी कक्षा पदानुक्रम और विनाशकों को स्थिति के अनुसार आवश्यक बनाते हैं। भाषा को अधूरा कॉल करना क्योंकि यह सुविधा प्रदान करता है मूर्खतापूर्ण है। यह कहने की तरह निजी विरासत का मुद्दा क्या है। हां आम तौर पर आप इसका उपयोग नहीं करेंगे, लेकिन ऐसा होने का अवसर होगा जब यह अच्छा लगेगा।

संरक्षित सार आभासी आधार शुद्ध वर्चुअल प्राइवेट नाशक और जब पिछली बार जब आप एक

जरूरी था मुझे लगता है कि:

  1. इसके अलावा, मैं का नहीं लगता कि मेरी कक्षा अमूर्त

  2. विनाशक को आभासी होना चाहिए।
  3. लेकिन मैं एक कार्यान्वयन की जरूरत नहीं है तो अपने शुद्ध
  4. मैं संरक्षित विरासत उपयोग करेगा
+0

शुद्ध वर्चुअल का मतलब यह नहीं है कि कक्षा को कार्यान्वयन की आवश्यकता नहीं है, इसका मतलब है कि उप-वर्गों को कार्यान्वयन की आवश्यकता होनी चाहिए (और यदि वर्ग चुनता है तो कक्षा भी ऐसा कर सकती है)। – KayEss

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