चूंकि आप नीचे दिए गए कोड को कहते हैं, जो मेरे पास कार्यान्वयन पर काम करता है, तो आपके लिए टूटा हुआ है तो स्पष्ट रूप से कोड समस्या नहीं है। समस्या आपके सेट अप में कुछ और है; शायद एक कंपाइलर बग। आपको समस्या का कारण क्या हो सकता है, इसे कम करना चाहिए; चूंकि कोड स्वयं को किसी समस्या के रूप में अस्वीकार कर दिया जाता है, इसलिए शायद सबसे अच्छा अगला कदम आपके कंपाइलर को अपडेट करना है।
किसी भी मामले में जो इस प्रश्न को आपके सेट अप के लिए विशिष्ट बनाता है। अगर आपको कोई समाधान मिलता है जो अन्य लोगों पर लागू हो सकता है तो आपको वापस आना चाहिए और इसे पोस्ट करना चाहिए। तब तक मैं इस सवाल को बंद करने के लिए मतदान कर रहा हूं।
मैं आपकी समस्या को पुन: पेश करने की कोशिश कर रहा हूं। यहाँ कोड मैं का उपयोग कर रहा है:
#include <iostream>
struct A { int a; };
struct B { int b; };
struct B2 : virtual B, virtual A {};
struct B3 : virtual B, virtual A {};
struct B4 : virtual B2, virtual B3 {}; // these virtuals are unnecessary in this case...
struct C : virtual A {};
struct D : B4, C {};
int main() {
D d;
std::cout << &((B4*)&d)->a << '\n';
std::cout << &((B3*)(B4*)&d)->a << '\n';
std::cout << &((B2*)(B4*)&d)->a << '\n';
std::cout << &((A*)(B2*)(B4*)&d)->a << '\n';
std::cout << &((A*)(B3*)(B4*)&d)->a << '\n';
std::cout << &((C*)&d)->a << '\n';
std::cout << &((A*)(C*)&d)->a << '\n';
}
लेकिन परिणाम मैं उम्मीद के रूप में कर रहे हैं, जहां a
सदस्य हर वस्तु के लिए एक ही है। मैं एक ही परिणाम प्राप्त अगर मैं पते के रूप में अच्छी तरह से कंस्ट्रक्टर्स में प्रिंट आउट का उपयोग करें: मैं एक मामूली बदलाव करते हैं http://ideone.com/8FdQ1O
और सी की परिभाषा से virtual
कीवर्ड निकालने:
...
struct C : A {};
...
(version using constructors)
तब मुझे वह समस्या दिखाई देती है जहां आप वर्णन करते हैं कि सी के पास बी 2, बी 3 और बी 4 द्वारा उपयोग किए गए आभासी से अलग एक उप-वस्तु है।
क्या आप वाकई virtual
कीवर्ड का उपयोग कर रहे सभी स्थानों में कीवर्ड का उपयोग कर रहे हैं? आपके द्वारा दिखाए गए परिणाम यह इंगित करते हैं कि आप इसे कहीं याद कर रहे हैं। साथ ही, मुझे लगता है कि आपके द्वारा दिखाया गया आउटपुट आपके द्वारा दिखाए गए कोड खंडों के रूप में रचनाकारों के समान क्रम को प्रतिबिंबित नहीं करता है; आउटपुट ए() पहले दिखाता है, लेकिन कोड इंगित करता है कि बी() को पहले निष्पादित किया जाना चाहिए।
तरह से आभासी विरासत काम करता है कि एक सबसे व्युत्पन्न प्रकार प्रत्येक प्रकार कि लगभग विरासत ट्री में कहीं विरासत में मिलती है के लिए एक एकल आभासी उप वस्तु में शामिल होंगे है। साथ ही सबसे व्युत्पन्न प्रकार गैर आभासी विरासत का प्रत्येक उदाहरण के लिए एक उप-वस्तु में शामिल होंगे:
struct A {};
struct B : virtual A {};
struct C : A, B {};
struct D : virtual A, C {};
struct E : A, D {};
struct F : virtual A, E {};
struct G : A, F {};
G g;
g
चार A
उप वस्तुओं की कुल होता है; हर बार A
के लिए एक गैर लगभग है (C
, E
, और G
में), और एक बार बार A
लगभग विरासत में मिला है सभी के लिए विरासत में मिला (B
, D
, और F
में)।
यह एक भयंकर दिखने वाला हीरा है। –
डायमंड के भीतर डायमंड! –
आपको वास्तविक विरासत संबंधों का उपयोग करने की आवश्यकता है जो आप उपयोग कर रहे हैं। एकल उत्तर में प्रारूप का उपयोग करने पर विचार करें (केवल 'derived_type: [virtual] आधार, [आभासी] base2 ...' प्रदान करें। यह समझाने में भी दिलचस्प होगा कि आप आउटपुट –