क्या सामान्य (वर्चुअल) कन्स्ट्रक्टर कॉलिंग ऑर्डर को पास करने के लिए एक (व्यावहारिक) तरीका है?वर्चुअल बेस क्लास के ओवरलोडेड कन्स्ट्रक्टर को कॉल करना
उदाहरण:
class A
{
const int i;
public:
A()
: i(0)
{ cout << "calling A()" << endl; }
A(int p)
: i(p)
{ cout << "calling A(int)" << endl; }
};
class B
: public virtual A
{
public:
B(int i)
: A(i)
{ cout << "calling B(int)" << endl; }
};
class C
: public B
{
public:
C(int i)
: A(i), B(i)
{ cout << "calling C(int)" << endl; }
};
class D
: public C
{
public:
D(int i)
: /*A(i), */ C(i)
{ cout << "calling D(int)" << endl; }
};
int main()
{
D d(42);
return 0;
}
आउटपुट:
(पूर्णांक)बुला ए()
बी बुला (int)
बुला सी (int)
डी बुला (पूर्णांक)
बुला ए (int)
बी बुला
सी बुला (int)
बुला डी (int)
:
क्या मैं करना चाहता हूँ की तरह कुछ है
जैसा कि आप देखते हैं, वर्चुअल विरासत शामिल है, जो पहले के कन्स्ट्रक्टर को कॉल करने के लिए डी के निर्माता का नेतृत्व करती है, लेकिन चूंकि कोई पैरामीटर प्रदान नहीं किया जाता है, इसलिए यह ए() को कॉल करता है। कॉन्स int है जिसे प्रारंभिकरण की आवश्यकता है, इसलिए मुझे कोई समस्या है।
मैं सी के विरासत विवरण को छिपाने के लिए क्या करना चाहता हूं, यही कारण है कि मैं डी (और प्रत्येक व्युत्पन्न) कन्स्ट्रक्टर की प्रारंभिक सूची में ए (i) को कॉल करने से बचने का एक तरीका ढूंढ रहा हूं। [संपादित करें] इस विशिष्ट मामले में, मैं मान सकता हूं कि सी के केवल गैर-वर्चुअल एकल-विरासत बाल वर्ग हैं (जैसे डी एक है)। [/ संपादित करें]
[संपादित करें]
आभासी आधार वर्ग किसी भी गैर आभासी आधार वर्ग से पहले प्रारंभ कर रहे हैं प्रारंभ कर रहे हैं, तो केवल सबसे व्युत्पन्न वर्ग आभासी आधार वर्ग को प्रारंभ कर सकते हैं। - जेम्स McNellis
वास्तव में बात है कि, मैं नहीं सबसे व्युत्पन्न वर्ग आभासी आधार वर्ग निर्माता कॉल करना चाहते हैं ।
A
/\
B0 B1
\/
C
|
D
मुझे समझ में क्यों सी ए (अस्पष्टता) के ctor कॉल करने के लिए है जब आप: [/ संपादित करें]
निम्नलिखित स्थिति पर विचार करें ( ऊपर कोड उदाहरण में प्रतिनिधित्व नहीं) तत्काल सी, लेकिन डी को तुरंत चालू करते समय इसे क्यों कॉल करना है?
मुझे विश्वास नहीं है कि आपके कोड उदाहरण आपके द्वारा प्रदान किए जाने वाले आउटपुट के साथ मेल खाते हैं। क्या आप सुनिश्चित हैं कि आप निर्देश "डी डी;" के साथ डी को instanciate ? –
सूखी, मैं पैरामीटर भूल गया .... यह अब डी डी (42) है। धन्यवाद। – dyp
ठीक है, यह अधिक उचित लगता है :-) क्या मैं पूछ सकता हूं कि आप "डरावने हीरे" वास्तुकला का उपयोग क्यों करना चाहते हैं? क्या आप अपने कोड को किसी अन्य तरीके से पुनर्गठित नहीं कर सकते? –