दिलचस्प पोस्ट
से बचना! = नल बयान यह एक अनंत लूप में क्यों जाता है? ORA-00979 अभिव्यक्ति द्वारा एक समूह नहीं है कैसे एक जावा धागा को सुन्दरता से रोकना है? बाल तत्व पर मार्जिन मूल तत्व को स्थानांतरित करता है क्रिप्टोग्राफिक एक्सपैशन: पैडिंग अमान्य है और इसे हटाया नहीं जा सकता है और व्यूस्टेट मैक का सत्यापन विफल रहा है ActionBar में अतिप्रवाह मेनू में आइकन दिखाने के लिए जावा में "नया स्ट्रिंग (…)" अभिव्यक्ति का उद्देश्य क्या है? WPF में मौजूदा नियंत्रणों के लिए नियंत्रण टेम्पलेट अस्थायी बिंदु अंकगणित सटीक नतीजे का उत्पादन नहीं करते NullPointerException onCreate में दृश्यों को एक्सेस करना () Xcode 4.5 में रिलीज़ बिल्ड के लिए दोनों armv6 और armv7s का समर्थन कैसे करें आप Google Chrome में JavaScript डीबगर कैसे लॉन्च करते हैं? डी 3 जावास्क्रिप्ट में चर गुंजाइश NUnit Visual Studio 2010 कोड नहीं चल रहा है

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

मुसीबत:

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) {} /*... */ }; 

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