वर्चुअल विरासत केवल प्रासंगिक है यदि वर्ग Foo
से उत्तराधिकारी हैं।अगर मैं निम्नलिखित को परिभाषित:
class B {};
class L : virtual public B {};
class R : virtual public B {};
class D : public L, public R {};
तब अंतिम वस्तु केवल B
की एक प्रति, दोनों L
और R
द्वारा साझा शामिल होंगे। virtual
के बिना, D
प्रकार की एक वस्तु B
की दो प्रतियां, L
में से एक, और R
में से एक होगी।
कुछ तर्क है कि सभी विरासत आभासी होनी चाहिए (क्योंकि उन मामलों में जहां यह एक फर्क पड़ता है, यही वह समय है जो आप समय के अधिकांश चाहते हैं)। अभ्यास में, हालांकि, अधिकांश मामलों में वर्चुअल विरासत महंगा है, और आवश्यक नहीं है: एक अच्छी तरह से डिज़ाइन किया गया सिस्टम में, अधिकांश विरासत केवल एक या से अधिक "इंटरफेस" से प्राप्त एक ठोस वर्ग का होगा; ऐसी कंक्रीट कक्षा आमतौर पर होने के लिए डिज़ाइन नहीं की गई है, इसलिए कोई समस्या नहीं है। लेकिन अपवाद हैं: उदाहरण के लिए, यदि आप इंटरफ़ेस में इंटरफ़ेस को परिभाषित करते हैं, और फिर एक्सटेंशन को एक्सटेंशन इंटरफ़ेस से प्राप्त करना चाहिए, क्योंकि एक ठोस कार्यान्वयन कई एक्सटेंशन लागू करना चाहता है। या यदि आप मिक्स्डिन डिज़ाइन कर रहे हैं, जहां कुछ कक्षाएं केवल इंटरफ़ेस का हिस्सा लागू करती हैं, और अंतिम कक्षा इन कक्षाओं में से कई से प्राप्त होती है ( इंटरफ़ेस का एक हिस्सा)। अंत में, कि क्या करने के लिए के रूप में criteron वारिस के लगभग या नहीं भी मुश्किल नहीं है:
अगर विरासत सार्वजनिक नहीं है, यह शायद नहीं आभासी होना चाहिए (मैं कभी नहीं देखा है एक अपवाद), अन्यथा
अगर वर्ग एक आधार वर्ग होने के लिए नहीं बनाया गया है, आभासी विरासत के लिए कोई आवश्यकता नहीं है, अन्यथा
विरासत आभासी होना चाहिए।
में कुछ अपवाद भी हैं, लेकिन उपरोक्त नियमों सुरक्षा की ओर गलती; वर्चुअल विरासत आवश्यक नहीं है, यहां तक कि उन मामलों में भी वस्तुतः वारिस करने के लिए यह "सही" है।
एक अंतिम बिंदु: एक आभासी आधार हमेशा की तरह, सबसे व्युत्पन्न वर्ग द्वारा प्रारंभ किया जाना चाहिए नहीं वर्ग कि सीधे विरासत में (और घोषणा करता है कि विरासत आभासी है)। अभ्यास में, हालांकि, यह एक गैर-मुद्दा है। यदि आप उन मामलों को देखते हैं जहां वर्चुअल विरासत समझ में आता है, तो यह हमेशा इंटरफ़ेस से विरासत का मामला है, जिसमें डेटा नहीं होगा, और इस प्रकार (केवल) एक डिफ़ॉल्ट कन्स्ट्रक्टर होगा। यदि आप को रचनाकारों के साथ कक्षाओं से लगभग विरासत में पाते हैं जो तर्क लेते हैं, तो यह समय के बारे में कुछ गंभीर प्रश्न पूछने का समय है।
स्रोत
2011-11-16 09:35:06
मैं जवाब देने वाला नहीं हूं क्योंकि विषय वस्तु वास्तव में इस तरह के उथले उपचार के लायक नहीं है: लेकिन 'वर्चुअल' के बिना 'कक्षा' से प्राप्त प्रत्येक वर्ग के पास 'बार' की अपनी प्रति 'वर्चुअल' होगी, सबसे व्युत्पन्न कक्षा में 'बार' की केवल एक प्रति होगी। –
आज़माएं: [यह खोज] (http://stackoverflow.com/search?क्यू = वर्चुअल + विरासत +% 5 बीसी% 2 बी% 2 बी% 5 डी) –
[सी ++ वर्चुअल बेस क्लास में?] (http://stackoverflow.com/questions/21558/in-c-virtual-base-class) के संभावित डुप्लिकेट –