मैं this entry से देखता हूं कि आभासी विरासत किसी ऑब्जेक्ट की मेमोरी पदचिह्न में आकार (सूचक) जोड़ती है। इसके अलावा, क्या डिफ़ॉल्ट रूप से वर्चुअल विरासत का उपयोग करके मेरे लिए कोई कमी है, और केवल आवश्यकता होने पर पारंपरिक विरासत? ऐसा लगता है कि इससे भविष्य के सबूत वर्ग डिजाइन का कारण बन जाएगा, लेकिन शायद मुझे कुछ पतन हो रहा है।सी ++ में, क्या मुझे लगभग हमेशा वर्चुअल विरासत का उपयोग करना चाहिए?
उत्तर
कमियां हैं कि
- सभी वर्गों को हर समय अपने सभी आभासी ठिकानों को प्रारंभ करना होगा (जैसे अगर एक बी की आभासी आधार है, और सी बी से निकला है, यह भी एक ही प्रारंभ करने में है)।
- आपको हर जगह
dynamic_cast
का उपयोग करना होगा, जहां आपstatic_cast
का उपयोग कर सकते हैं (आपके सिस्टम के आधार पर समस्या हो सकती है या नहीं हो सकती है और क्या आपके डिज़ाइन की आवश्यकता है)।
अकेले प्वाइंट 1 इसे लायक नहीं बनाता है, क्योंकि आप अपने वर्चुअल बेस को छुपा नहीं सकते हैं। लगभग हमेशा एक बेहतर तरीका है।
ओह भगवान (1) भयानक है। धन्यवाद! क्या आप (2) के बारे में अधिक स्पष्ट हो सकते हैं? क्या आपका मतलब है कि अगर मैं static_cast
@SuperElectric: क्यों (1) भयानक है? यदि बेस सबबोजेक्ट शुरू नहीं किया गया तो बेहतर होगा? ;) – Yttrill
टिप्पणियां जैसे "यह इसके लायक नहीं है" वर्चुअल बेस के उद्देश्य को समझने में पूरी विफलता दिखाती है: वर्चुअल विरासत * हमेशा * का उपयोग तब किया जाना चाहिए जब आप एक अमूर्त उपखंड कर रहे हों। यदि आप इसका उपयोग करने में विफल रहते हैं तो कोई कामकाज या अन्य संभावना नहीं है, आप वापस जाने और अपनी डिज़ाइन त्रुटि को ठीक करने के बिना अबास्ट्रक्शन के एकाधिक सबक्लासिंग का उपयोग नहीं कर सकते हैं, इस प्रकार encapsulation तोड़ना। – Yttrill
मेरे अनुभव में, वर्चुअल विरासत (वर्चुअल विधियों के विपरीत) लगभग कभी आवश्यकता नहीं है। सी ++ में इसका उपयोग "diamond inheritance problem" को संबोधित करने के लिए किया जाता है, जो कि यदि आप एकाधिक विरासत से बचते हैं तो वास्तव में नहीं हो सकता है।
मुझे पूरा यकीन है कि मुझे कभी भी सी ++ किताबों के बाहर वर्चुअल विरासत का सामना नहीं हुआ है, जिसमें मैं लिखने वाले कोड और लाख + लाइन सिस्टम दोनों को बनाए रखता हूं।
मानक सी ++ I/O स्ट्रीम लाइब्रेरी वर्चुअल विरासत का उपयोग करता है। लेकिन हाँ, इसके अलावा यह आमतौर पर बहुत दुर्लभ है। –
ग्रेग: पूरे वर्चुअल उत्तराधिकारी गड़बड़ पर +1 उत्कृष्ट सामान्यीकरण। –
हम्म ... मुझे पहले से ही पता है कि यह किस लिए है (मैं इसका उपयोग करने के बारे में सोच रहा हूं), और मैं समझता हूं कि यह दुर्लभ है (मैं सी ++ में कोड), लेकिन सवाल यह है कि "वर्चुअल विरासत की कमी क्या है"। – SuperElectric
- 1. क्या मुझे विरासत या संरचना का उपयोग करना चाहिए?
- 2. क्या मुझे हमेशा GL_CULL_FACE का उपयोग करना चाहिए?
- 3. मुझे क्या gacutil.exe का उपयोग करना चाहिए?
- 4. सी # स्टेटिक विरासत की कमी - मुझे क्या करना चाहिए?
- 5. सी # लॉगिंग। मुझे क्या उपयोग करना चाहिए?
- 6. क्या मुझे हमेशा उद्देश्य-सी में आवृत्ति चर के लिए एक्सेसर्स का उपयोग करना चाहिए?
- 7. सी # मुझे सूची का उपयोग कब करना चाहिए और मुझे सरणीसूची का उपयोग कब करना चाहिए?
- 8. क्या मुझे HttpRuntime.Cache का उपयोग करना चाहिए?
- 9. क्या मुझे jQuery.each() का उपयोग करना चाहिए?
- 10. क्या मुझे jQuery.inArray() का उपयोग करना चाहिए?
- 11. क्या मुझे बूटस्ट्रैप का उपयोग करना चाहिए?
- 12. क्या मुझे जावास्क्रिप्ट में बहुरूपता का उपयोग करना चाहिए?
- 13. क्या मुझे स्थिर डेटा सदस्यों का उपयोग करना चाहिए? (सी ++)
- 14. नया सी ++: क्या मुझे विजुअल स्टूडियो का उपयोग करना चाहिए?
- 15. सी ++: वर्चुअल विरासत
- 16. मुझे _aligned_malloc() का उपयोग कब करना चाहिए?
- 17. मुझे ईएमएफ का उपयोग क्यों करना चाहिए?
- 18. मुझे उद्देश्य सी में असाइन का उपयोग कब करना चाहिए?
- 19. एसक्यूएल वैरिएबल चुनें - क्या मुझे इस वाक्यविन्यास का उपयोग करने से बचाना चाहिए और हमेशा एसईटी का उपयोग करना चाहिए?
- 20. उद्देश्य-सी में, मुझे कक्षा विधियों का उपयोग कब करना चाहिए और मुझे उदाहरण विधियों का उपयोग कब करना चाहिए?
- 21. क्या मुझे इस मामले में विरासत या संरचना का उपयोग करना चाहिए?
- 22. क्या मुझे हमेशा सिल्वरलाइट गेम में गेमिंग लूप का उपयोग करना चाहिए?
- 23. क्या मुझे हमेशा MyISQL पर MySQL InnoDB पसंद करना चाहिए?
- 24. क्या मुझे जावा में क्यूटी जंबी का उपयोग करना चाहिए?
- 25. क्या मुझे पर्ल में ऑटोबॉक्स का उपयोग करना चाहिए?
- 26. क्या मुझे IntentService में वेक लॉक का उपयोग करना चाहिए?
- 27. क्या मुझे वास्तव में विदेशी कुंजी का उपयोग करना चाहिए?
- 28. क्या मुझे इस स्थिति में ड्रोल का उपयोग करना चाहिए?
- 29. रेल में, क्या मुझे जेनरेटर का उपयोग करना चाहिए?
- 30. क्या मुझे स्कैला का अध्ययन करना चाहिए?
बेस वर्गों के प्रारंभिकरण का क्रम ज्यादातर लोगों के लिए स्पष्ट नहीं होता है। इस प्रकार रखरखाव लागत में वृद्धि। –
वर्चुअल विरासत केवल कुछ कार्यान्वयन पर एक आंतरिक सूचक जोड़ता है। Itanium एबीआई आंतरिक पॉइंटर्स का उपयोग नहीं करता है, केवल vptr। – curiousguy