दिलचस्प पोस्ट
"Var" या नहीं "var" जावास्क्रिप्ट के "फॉर-इन" लूप में है? ओरेकल एसक्यूएल डेवलपर में दी गई तालिका को किस तालिका में पता लगाया जा सकता है? कोर ग्राफिक्स वस्तुओं के साथ एआरसी काम करता है? जावास्क्रिप्ट का उपयोग कर ध्वनि सूचनाओं को चलाया जा रहा है? क्या पायथन में बिटफ़ाइल प्रकार है? Geom_point में लेबल अंक अजगर में संपत्ति की सुविधा का उपयोग करने के बारे में वास्तविक दुनिया का उदाहरण? दो अक्षांश-अक्षांश अंक के बीच दूरी की गणना करें? (हावेर्सिन फॉर्मूला) जावास्क्रिप्ट में एक नया स्थान ऑब्जेक्ट बनाना एक SQL सर्वर 2008 एक्सप्रेस डेटाबेस पर सभी प्रश्नों को लॉगिंग? वेब एपीआई 2: ऑब्जेक्ट्स और उनके उप-ऑब्जेक्ट्स पर, यूएमएल के साथ यूज़ेल के साथ कैसे आए संपत्ति के नाम वापस करने के लिए एंड्रॉइड: "बल बंद" होने के बाद एप्लिकेशन को स्वत: पुनरारंभ कैसे करें? (पीआई) स्पार्क में डेटा लिखने और पढ़ने के लिए जेडीबीसी स्रोत का उपयोग कैसे करें? OSX पर जीसीसी अपडेट करें पायथन में बहुत बड़ी संख्या को संभालना

सी ++ आभासी विरासत

मुसीबत:

class Base { public: Base(Base* pParent); /* implements basic stuff */ }; class A : virtual public Base { public: A(A* pParent) : Base(pParent) {} /* ... */ }; class B : virtual public Base { public: B(B* pParent) : Base(pParent) {} /* ... */ }; class C : public A, public B { public: C(C* pParent) : A(pParent), B(pParent) {} // - Compilation error here /* ... */ }; 

दी गई स्थिति में, जीसीसी शिकायत करता है कि यह फ़ंक्शन कॉल बेस () से मेल नहीं कर सकता, अर्थात डिफ़ॉल्ट कन्स्ट्रक्टर। लेकिन सी बेस से सीधे ए, बी और बी के माध्यम से ही नहीं मिलता है। तो जीसीसी शिकायत क्यों करता है?

विचार? टीआईए / रोब

वेब के समाधान से एकत्रित समाधान "सी ++ आभासी विरासत"

virtual आधार वर्ग विशेष होते हैं कि वे सबसे अधिक व्युत्पन्न वर्ग द्वारा आरंभ किए जाते हैं और वर्चुअल आधार से प्राप्त होने वाली किसी भी इंटरमीडिएट बेस क्लास द्वारा नहीं। संभावित आधार पर कौन सा प्रारंभिक एक आधार को आरंभ करने के लिए सही विकल्प होगा?

यदि सबसे अधिक व्युत्पन्न वर्ग का निर्माण किया गया है, तो उसे सदस्य सदस्यता सूची में सूचीबद्ध नहीं किया जाता है, तो वर्चुअल बेस क्लास को उसके डिफॉल्ट कन्स्ट्रक्टर के साथ आरंभ किया जाता है जो कि मौजूद होना चाहिए और पहुंच योग्य होना चाहिए।

ध्यान दें कि वर्चुअल बेस पहचानकर्ता को कन्स्ट्रक्टर की प्रारंभिक सूची में उपयोग करने की अनुमति दी जाती है भले ही वह प्रश्न में वर्ग का प्रत्यक्ष आधार न हो।

आपको सी से बेस के लिए कन्स्ट्रक्टर को स्पष्ट रूप से कॉल करने की ज़रूरत है:

 class C : public A, public B { public: C(C* pParent) : Base(pParent), A(pParent), B(pParent) {} /*... */ }; 

यदि आप एक कस्टम कन्स्ट्रक्टर घोषित करते हैं, तो डिफ़ॉल्ट कन्स्ट्रक्टर अक्षम है। आभासी विरासत में आपको वस्तुतः विरासत में मिला कन्स्ट्रक्टर को सीधे कॉल करने की आवश्यकता है क्योंकि अन्यथा यह नहीं जानती कि ए या बी द्वारा आरंभ करना है या नहीं।