2011-04-03 14 views
6

मैंने समझने की कोशिश की है लेकिन अभी भी सुनिश्चित नहीं है। यदि बेस क्लास में कोई कन्स्ट्रक्टर है, तो व्युत्पन्न कक्षाएं हमेशा इसे कॉल करेंगी? मुझे पता है कि वे इसे ओवरराइड कर सकते हैं (यहां सही शब्द नहीं है, मुझे पता है - मेरा मतलब है कि उनके रचनाकारों को कोड जोड़ें) लेकिन मुझे लगता है कि कन्स्ट्रक्टर को बेस क्लास में परिभाषित किया गया है, व्युत्पन्न लोग इसे हमेशा कॉल करेंगे। क्या यह सच है?कन्स्ट्रक्टर्स विरासत

उत्तर

6

हां, यदि कोई पैरामीटर रहित कन्स्ट्रक्टर है तो इसे हमेशा बुलाया जाएगा। यदि वहाँ एक से अधिक निर्माता, आप चुन सकते हैं कि base कीवर्ड के साथ कॉल करने के लिए:

class Parent { 
    public Parent() {} 
    public Parent(int x) {} 
} 

class Child : Parent { 
    public Child(int x) : base(x) { 
    } 
} 

यदि वहाँ कोई parameterless निर्माता, आप हो जाएगा मजबूर यह करने के लिए:

class Parent { 
    public Parent(int x) {} 
} 

class Child : Parent { 
    // This will not compile without "base(x)" 
    public Child(int x) : base(x) { 
    } 
} 
+0

मुझे यकीन नहीं है कि मुझे यह मिल गया है। पहले उदाहरण में, चाइल्ड (इंट एक्स) है: आधार (एक्स) तो मुझे लगता है कि दोनों को बुलाया जाएगा? – Miria

+0

@ मिरिया: हाँ। ऐसा कोई तरीका नहीं है कि * कुछ * बेस कन्स्ट्रक्टर नहीं कहा जाएगा (उदाहरण के लिए दूसरे उदाहरण में संकलक आपको 'बेस (x) ') को हटाने नहीं देगा; 'बेस' का उपयोग करने से आपको बस * कौन सा * कॉल किया जाएगा, और किस पैरामीटर के साथ चयन करने की अनुमति मिलती है। – Jon

2

यदि बेस क्लास में केवल पैरामीटर रहित कन्स्ट्रक्टर है, तो बाल वर्ग का निर्माता हमेशा इसे पहले कॉल करेगा। दूसरी ओर यदि आपके पास बेस क्लास में परिभाषित अन्य रचनाकार हैं, तो बाल वर्ग में एक विकल्प होगा जो कॉल करने के लिए आधार निर्माता होगा।

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