2010-07-10 12 views
9

मैं एक आधार वर्ग कि वाणी और एक निर्माता को परिभाषित करता है है, लेकिन किसी कारण से सार्वजनिक रूप से वर्ग व्युत्पन्न मेरे कि निर्माता देख पा रहा है, और इसलिए मैं स्पष्ट रूप से व्युत्पन्न वर्ग में एक अग्रेषण निर्माता घोषित करने के लिए है:मेरे सी ++ सबक्लास को एक स्पष्ट निर्माता की आवश्यकता क्यों है?

class WireCount0 { 
protected: 
    int m; 
public: 
    WireCount0(const int& rhs) { m = rhs; } 
}; 

class WireCount1 : public WireCount0 {}; 

class WireCount2 : public WireCount0 { 
public: 
    WireCount2(const int& rhs) : WireCount0(rhs) {} 
}; 

int dummy(int argc, char* argv[]) { 
    WireCount0 wireCount0(100); 
    WireCount1 wireCount1(100); 
    WireCount2 wireCount2(100); 
    return 0; 
} 

उपर्युक्त कोड में, मेरे WireCount1 wireCount1(100) घोषणा को संकलक द्वारा अस्वीकार कर दिया गया है ("वायरकाउंट 1 :: वायरकाउंट 1 (int) 'पर कॉल के लिए कोई मिलान करने वाला फ़ंक्शन नहीं है), जबकि मेरे wireCount0 और wireCount2 घोषणाएं ठीक हैं।

मुझे यकीन नहीं है कि मुझे समझ में आता है कि मुझे WireCount2 में दिखाए गए स्पष्ट कन्स्ट्रक्टर को क्यों प्रदान करने की आवश्यकता है। ऐसा इसलिए है क्योंकि संकलक WireCount1 के लिए एक डिफ़ॉल्ट कन्स्ट्रक्टर उत्पन्न करता है, और वह कन्स्ट्रक्टर WireCount0 कन्स्ट्रक्टर छुपाता है?

संदर्भ के लिए, कंपाइलर i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5659) है।

उत्तर

4

सभी व्युत्पन्न कक्षाओं को अपने बेस क्लास के कन्स्ट्रक्टर को कुछ आकार या रूप में कॉल करना होगा।

जब आप ओवरलोडेड कन्स्ट्रक्टर बनाते हैं, तो आपका डिफ़ॉल्ट कंपाइलर जेनरेट पैरामीटर रहित गायब हो जाता है और व्युत्पन्न कक्षाओं को ओवरलोडेड कन्स्ट्रक्टर को कॉल करना होगा।

जब आप कुछ इस तरह है:

class Class0 { 
} 

class Class1 : public Class0 { 
} 

संकलक वास्तव में इस उत्पन्न करता है:

class Class0 { 
public: 
    Class0(){} 
} 

class Class1 : public Class0 { 
    Class1() : Class0(){} 
} 

आप नॉन-डिफ़ॉल्ट निर्माता है, parameterless निर्माता नहीं रह गया है उत्पन्न होता है। आप निम्नलिखित को परिभाषित जब:

class Class0 { 
public: 
    Class0(int param){} 
} 

class Class1 : public Class0 { 
} 

संकलक नहीं रह गया है आधार वर्ग के निर्माता कॉल करने के लिए Class1 में एक निर्माता उत्पन्न करता है, आप स्पष्ट रूप से अपने आप को ऐसा करना चाहिए।

+0

मुझे लगता है कि आप उसके प्रश्न को गलत तरीके से पढ़ते हैं। वह नहीं पूछ रहा है कि वह कक्षा 1 के डिफ़ॉल्ट कन्स्ट्रक्टर को क्यों नहीं बुला सकता है, बल्कि कॉल करने के लिए कोई कक्षा 1 (int) कन्स्ट्रक्टर क्यों नहीं है। – Shirik

+1

कंपाइलर अभी भी आपके अंतिम उदाहरण में 'कक्षा 1()' कन्स्ट्रक्टर उत्पन्न करता है। यह सिर्फ इतना है कि यह कन्स्ट्रक्टर बीमार है अगर इसे वास्तव में परिभाषित किया गया है (डिफ़ॉल्ट रूप से सभी विशेष कार्यों के लिए, यह केवल तब तक घोषित किया जाता है जब तक इसका उपयोग वास्तव में नहीं किया जाता है)।आप इसे एक दोस्त बनाकर सत्यापित कर सकते हैं: 'कक्षा कक्षा 2 {दोस्त कक्षा 1 :: कक्षा 1(); }; ', जो काम करता है क्योंकि संकलक स्पष्ट रूप से डिफ़ॉल्ट कन्स्ट्रक्टर घोषित करता है इससे कोई फर्क नहीं पड़ता कि इसे वास्तव में कहा जा सकता है या नहीं। –

+0

धन्यवाद। यह मुझे बहुत स्पष्ट बनाता है। हालांकि मैं शिरिक की प्रतिक्रिया की सराहना करता हूं, मेरा मानना ​​है कि आपका उदाहरण दिखाता है कि मेरे कोड में क्या हो रहा है। –

14

रचनाकारों को विरासत में नहीं मिला है। आपको व्युत्पन्न कक्षा के लिए एक कन्स्ट्रक्टर बनाना है। व्युत्पन्न वर्ग के निर्माता, इसके अलावा, बेस क्लास के कन्स्ट्रक्टर को कॉल करना होगा।

+1

इसके अलावा, यदि बेस क्लास में एक डिफ़ॉल्ट कन्स्ट्रक्टर है, तो संकलक उस का उपयोग करेगा यदि आप स्पष्ट रूप से व्युत्पन्न कक्षा में किसी निर्माता की प्रारंभकर्ता सूची में कोई कन्स्ट्रक्टर निर्दिष्ट नहीं करते हैं। –

+0

धन्यवाद। मुझे एहसास नहीं हुआ कि रचनाकारों को कभी विरासत में नहीं मिला था। मैंने खुद को आश्वस्त किया था कि अन्य बेस क्लास कन्स्ट्रक्टर (वास्तविक कोड में) वास्तव में दिखाई दे रहे थे, लेकिन अब मैं उस कास्टिंग के समूह के लिए विशेषता देता हूं जो संकलक कर रहा था। –

+0

मुझे खेद है कि एक नौसिखिया के रूप में, मेरे पास अभी तक आपके उत्तर को बढ़ाने के लिए पर्याप्त प्रतिष्ठा अंक नहीं हैं। –

1

व्युत्पन्न से निपटने से पहले आपको अपनी बेस क्लास बनाना है। यदि आप अपनी व्युत्पन्न कक्षा को गैर-तुच्छ कन्स्ट्रक्टर के साथ बनाते हैं, तो संकलक तय नहीं कर सकता कि आधार के लिए क्या कॉल करना है, यही कारण है कि त्रुटि हो रही है।

+0

फिर भी एक और सही जवाब Theres। धन्यवाद। –

संबंधित मुद्दे