2010-08-19 15 views
16

वर्ग डिफ़ॉल्ट निर्माता प्रदान नहीं के लिए आभासी विरासत के लिए संभव है?डिफ़ॉल्ट निर्माता और आभासी विरासत

वर्तमान हीरा आरेख (कोई डिफ़ॉल्ट निर्माता का केवल परिवर्तन के साथ सरल एक प्रदान की गई) (छ ++ 4.4.3) संकलन नहीं है।

class A { 
public: 
    A(int) {} 
}; 
class B : virtual public A { 
public: 
    B(int i) : A(i) {} 
}; 
class C : virtual public A { 
public: 
    C(int i) : A(i) {} 
}; 
class D : public B, public C { 
public: 
    D(int i) : B(i), C(i) {} 
}; 

धन्यवाद, फ्रांसेस्को

उत्तर

3

मेरा मानना ​​है कि अपने वर्ग D भी स्पष्ट रूप से A के अपने प्रारंभकर्ता सूची में निर्माता कॉल करने के लिए की जरूरत है।

22

आप A के निर्माता स्पष्ट रूप से यहाँ कॉल करने की आवश्यकता

D(int i) : A(i), B(i), C(i) {} 

आभासी आधार वर्ग कि में विशेष वे सबसे व्युत्पन्न वर्ग से और किसी भी मध्यवर्ती आधार वर्ग कि आभासी से विरासत से नहीं प्रारंभ हो रहे हैं आधार। एक आधार शुरू करने के लिए संभावित एकाधिक प्रारंभकर्ता कौन सा सही विकल्प होगा?

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

बेशर्मी here से नकल :-)

1

डॉ डोब्स लेख Multiple Inheritance Considered Useful इस के साथ काम कर के विभिन्न तरीकों बताते हैं। सिफारिश मूल रूप से डिफ़ॉल्ट कन्स्ट्रक्टर और init() विधियों को प्रदान करने के लिए है। यह बी और सी के लिए और अधिक काम कहते हैं लेकिन ए

+1

डी ए से अनजान है, ज़ाहिर है, वांछनीय छोड़कर। दुर्भाग्यवश, 'init()' समाधान में कमी आई है: ए के कन्स्ट्रक्टर को दो बार (बी और सी द्वारा प्रत्येक बार) कहा जाएगा, जिसके दुष्प्रभाव हो सकते हैं (विशेष रूप से यदि स्थिर सदस्य उपयोग किए जाते हैं)। साथ ही, यदि कोई डेवलपर 'कक्षा डी: सार्वजनिक ए {} 'बनाता है, तो' init() 'विधि को बिल्कुल भी नहीं कहा जा सकता है, वस्तु को एक प्रारंभिक स्थिति में छोड़कर। – Marste

0

के बारे में पता करने के लिए होने से विकास को रोकता है आप इस तरह explict कॉल एक के निर्माण की जरूरत है:

D(int i) : A(i), B(i), C(i) {} 
संबंधित मुद्दे