मैं एक आधार वर्ग कि वाणी और एक निर्माता को परिभाषित करता है है, लेकिन किसी कारण से सार्वजनिक रूप से वर्ग व्युत्पन्न मेरे कि निर्माता देख पा रहा है, और इसलिए मैं स्पष्ट रूप से व्युत्पन्न वर्ग में एक अग्रेषण निर्माता घोषित करने के लिए है:मेरे सी ++ सबक्लास को एक स्पष्ट निर्माता की आवश्यकता क्यों है?
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)
है।
मुझे लगता है कि आप उसके प्रश्न को गलत तरीके से पढ़ते हैं। वह नहीं पूछ रहा है कि वह कक्षा 1 के डिफ़ॉल्ट कन्स्ट्रक्टर को क्यों नहीं बुला सकता है, बल्कि कॉल करने के लिए कोई कक्षा 1 (int) कन्स्ट्रक्टर क्यों नहीं है। – Shirik
कंपाइलर अभी भी आपके अंतिम उदाहरण में 'कक्षा 1()' कन्स्ट्रक्टर उत्पन्न करता है। यह सिर्फ इतना है कि यह कन्स्ट्रक्टर बीमार है अगर इसे वास्तव में परिभाषित किया गया है (डिफ़ॉल्ट रूप से सभी विशेष कार्यों के लिए, यह केवल तब तक घोषित किया जाता है जब तक इसका उपयोग वास्तव में नहीं किया जाता है)।आप इसे एक दोस्त बनाकर सत्यापित कर सकते हैं: 'कक्षा कक्षा 2 {दोस्त कक्षा 1 :: कक्षा 1(); }; ', जो काम करता है क्योंकि संकलक स्पष्ट रूप से डिफ़ॉल्ट कन्स्ट्रक्टर घोषित करता है इससे कोई फर्क नहीं पड़ता कि इसे वास्तव में कहा जा सकता है या नहीं। –
धन्यवाद। यह मुझे बहुत स्पष्ट बनाता है। हालांकि मैं शिरिक की प्रतिक्रिया की सराहना करता हूं, मेरा मानना है कि आपका उदाहरण दिखाता है कि मेरे कोड में क्या हो रहा है। –