2012-12-06 28 views
7

मैं आभासी विरासत की अवधारणा को समझता हूं, लेकिन मुझे इसका उत्तर कहीं भी नहीं मिला। मान लें कि आपके पास कक्षा डी है और कक्षा बी और सी दोनों को विरासत में मिला है। बी और सी दोनों कक्षा ए का उत्तराधिकारी हैं। इसलिए आप बी और सी को ए के दो उदाहरणों से बचने के लिए वस्तुतः ए को प्राप्त कर सकते हैं लेकिन क्या आपको बी और सी दोनों में वर्चुअल विरासत निर्दिष्ट करना है या क्या यह पहले से ही ए का एक उदाहरण बना देता है यदि दो में से एक को वास्तव में ए और दूसरा नहीं मिलता है?वर्चुअल विरासत, एक कक्षा पर्याप्त है?

धन्यवाद

उत्तर

11

वे सब होना चाहिए virtual। सी ++ 11 10.1 [वर्ग.एमआई]/7:

एक कक्षा में किसी दिए गए प्रकार के वर्चुअल और गैर वर्चुअल बेस क्लास दोनों हो सकते हैं।

class B { /* ... */ }; 
class X : virtual public B { /* ... */ }; 
class Y : virtual public B { /* ... */ }; 
class Z : public B { /* ... */ }; 
class AA : public X, public Y, public Z { /* ... */ }; 

वर्ग AA का एक उद्देश्य के लिए, AA के वर्ग जाली में आधार वर्ग B के सभी आभासी घटनाओं प्रकार AA की वस्तु के भीतर एक भी B subobject के अनुरूप है, और एक (गैर आभासी के हर घटना) AA की कक्षा जाली में बेस क्लास BAA के ऑब्जेक्ट के भीतर एक अलग B सबोबजेक्ट के साथ एक-से-एक के अनुरूप है। वर्ग AA ऊपर परिभाषित को देखते हुए, वर्ग AA वर्ग B के दो subobjects है: जैसा कि नीचे दिखाया, Z के B और आभासी BX और Y द्वारा साझा की है।

virtual inheritance example

+0

इसके अलावा, §10.1/4 वास्तव में इसे परिभाषित करता है। –

+0

@sftrabbit: मानक की किस प्रति में? सी ++ 03 में, यह '10.1 [class.mi]/6' है; नवीनतम उपलब्ध कामकाजी पेपर, एन 3485 में, यह अभी भी '10.1 [class.mi]/7' है। मेरे पास कोई मानक प्रतियां नहीं हैं जहां इसे '10.1 [class.mi]/4' में परिभाषित किया गया है। –

+0

मैंने हमेशा सोचा है कि उन्होंने ओपी क्या पूछ रहा है क्यों नहीं दिया। मुझे गैर वर्चुअल बच्चे के माता-पिता को इंगित करने वाले वर्चुअल बच्चे को कोई तार्किक बाधा दिखाई नहीं देती है। – enobayram

7

आप एक ए अन्यथा वर्ग कि आभासी वंशानुक्रम का उपयोग नहीं कर रहा है "शेयर" वर्ग ए

यह करने के लिए एक सक्षम कर सकते हैं जाएगा करने के लिए दोनों बी और सी के लिए आभासी विरासत निर्दिष्ट करने की आवश्यकता

inheritance

क्यों आप इस अलग बात है क्या करना चाहते हैं: निम्नलिखित है।

+0

अफसोस की बात है कि मैं केवल एक जवाब स्वीकार कर सकता हूं, हालांकि स्पष्टीकरण के लिए धन्यवाद;) – Invalid

+4

मैं हाथ से तैयार और स्कैन किए गए आरेख के लिए +1 दे रहा हूं। –

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