2010-12-28 8 views
18

मैं this entry से देखता हूं कि आभासी विरासत किसी ऑब्जेक्ट की मेमोरी पदचिह्न में आकार (सूचक) जोड़ती है। इसके अलावा, क्या डिफ़ॉल्ट रूप से वर्चुअल विरासत का उपयोग करके मेरे लिए कोई कमी है, और केवल आवश्यकता होने पर पारंपरिक विरासत? ऐसा लगता है कि इससे भविष्य के सबूत वर्ग डिजाइन का कारण बन जाएगा, लेकिन शायद मुझे कुछ पतन हो रहा है।सी ++ में, क्या मुझे लगभग हमेशा वर्चुअल विरासत का उपयोग करना चाहिए?

+2

बेस वर्गों के प्रारंभिकरण का क्रम ज्यादातर लोगों के लिए स्पष्ट नहीं होता है। इस प्रकार रखरखाव लागत में वृद्धि। –

+0

वर्चुअल विरासत केवल कुछ कार्यान्वयन पर एक आंतरिक सूचक जोड़ता है। Itanium एबीआई आंतरिक पॉइंटर्स का उपयोग नहीं करता है, केवल vptr। – curiousguy

उत्तर

20

कमियां हैं कि

  1. सभी वर्गों को हर समय अपने सभी आभासी ठिकानों को प्रारंभ करना होगा (जैसे अगर एक बी की आभासी आधार है, और सी बी से निकला है, यह भी एक ही प्रारंभ करने में है)।
  2. आपको हर जगह dynamic_cast का उपयोग करना होगा, जहां आप static_cast का उपयोग कर सकते हैं (आपके सिस्टम के आधार पर समस्या हो सकती है या नहीं हो सकती है और क्या आपके डिज़ाइन की आवश्यकता है)।

अकेले प्वाइंट 1 इसे लायक नहीं बनाता है, क्योंकि आप अपने वर्चुअल बेस को छुपा नहीं सकते हैं। लगभग हमेशा एक बेहतर तरीका है।

+0

ओह भगवान (1) भयानक है। धन्यवाद! क्या आप (2) के बारे में अधिक स्पष्ट हो सकते हैं? क्या आपका मतलब है कि अगर मैं static_cast (my_virtual_base_instance) का उपयोग करने का प्रयास करता हूं तो संकलक एक त्रुटि फेंकता है? – SuperElectric

+1

@SuperElectric: क्यों (1) भयानक है? यदि बेस सबबोजेक्ट शुरू नहीं किया गया तो बेहतर होगा? ;) – Yttrill

+3

टिप्पणियां जैसे "यह इसके लायक नहीं है" वर्चुअल बेस के उद्देश्य को समझने में पूरी विफलता दिखाती है: वर्चुअल विरासत * हमेशा * का उपयोग तब किया जाना चाहिए जब आप एक अमूर्त उपखंड कर रहे हों। यदि आप इसका उपयोग करने में विफल रहते हैं तो कोई कामकाज या अन्य संभावना नहीं है, आप वापस जाने और अपनी डिज़ाइन त्रुटि को ठीक करने के बिना अबास्ट्रक्शन के एकाधिक सबक्लासिंग का उपयोग नहीं कर सकते हैं, इस प्रकार encapsulation तोड़ना। – Yttrill

11

मेरे अनुभव में, वर्चुअल विरासत (वर्चुअल विधियों के विपरीत) लगभग कभी आवश्यकता नहीं है। सी ++ में इसका उपयोग "diamond inheritance problem" को संबोधित करने के लिए किया जाता है, जो कि यदि आप एकाधिक विरासत से बचते हैं तो वास्तव में नहीं हो सकता है।

मुझे पूरा यकीन है कि मुझे कभी भी सी ++ किताबों के बाहर वर्चुअल विरासत का सामना नहीं हुआ है, जिसमें मैं लिखने वाले कोड और लाख + लाइन सिस्टम दोनों को बनाए रखता हूं।

+0

मानक सी ++ I/O स्ट्रीम लाइब्रेरी वर्चुअल विरासत का उपयोग करता है। लेकिन हाँ, इसके अलावा यह आमतौर पर बहुत दुर्लभ है। –

+0

ग्रेग: पूरे वर्चुअल उत्तराधिकारी गड़बड़ पर +1 उत्कृष्ट सामान्यीकरण। –

+1

हम्म ... मुझे पहले से ही पता है कि यह किस लिए है (मैं इसका उपयोग करने के बारे में सोच रहा हूं), और मैं समझता हूं कि यह दुर्लभ है (मैं सी ++ में कोड), लेकिन सवाल यह है कि "वर्चुअल विरासत की कमी क्या है"। – SuperElectric

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