2011-10-15 8 views
5
struct A{ 
    virtual void what() { cout << "Base" << endl; }; 
}; 

struct B : A { 
    virtual void what() { cout << "Sub" << endl; }; 
    int m; 
    B() : m(10) {}; 
    B(const A & x) : m(50) {}; 
}; 

void main() { 
    B b1; 
    B b2 = b1; 
    cout << "Number: " 
     << b2.m << endl; 
}; 

b2.m = 50 क्यों नहीं है? मैं एक बी-ऑब्जेक्ट की प्रतिलिपि बनाने की कोशिश कर रहा हूं और मेरे पास कॉपी कन्स्ट्रक्टर बी (कॉन्स ए & x) है: एम (50)। क्या मुझे व्युत्पन्न वर्ग गधे के लिए एक कॉपी c'tor बनाने की ज़रूरत है? बी की तरह (कॉन्स बी & एक्स) ?? मैंने सोचा था कि के बाद से एक बी-वस्तु एक एक हिस्सा है, हम बी (स्थिरांक एक & एक्स) इस्तेमाल कर सकते हैं: default निर्माता के बजाय मीटर (50): एसकॉपी-कन्स्ट्रक्टर विरासत

मामले में जहां पैरामीटर के साथ एक समारोह है एक वस्तु का, आप एक बी वस्तु में भेज सकते हैं। यह कॉपी कन्स्ट्रक्टर के साथ कैसे अलग है?

उत्तर

14

कारण यह है कि B(const A& x) एक कॉपी-ctor नहीं है - कॉपी प्रकार T के लिए निर्माता के रूप में हमेशा पहले T के लिए एक lvalue संदर्भ लेना चाहिए (और कोई अन्य गैर-डिफ़ॉल्ट तर्क है) तर्क। आपकी कक्षा में कोई परिभाषित प्रति-सीटर नहीं है, इसलिए संकलक डिफ़ॉल्ट उत्पन्न करता है, जो सदस्य-प्रतिलिपि प्रतिलिपि करता है, इसलिए b2.mb1.m जैसा ही है।

वर्ग X के लिए एक गैर टेम्पलेट निर्माता अगर इसकी-सी युक्तियां पैरामीटर प्रकार X&, const X&, volatile X& या const volatile X& की है एक प्रति निर्माता है, और या तो कोई अन्य पैरामीटर वरना सभी अन्य पैरामीटर डिफ़ॉल्ट तर्क है देखते हैं (8.3 .6)।

1

कॉपी कन्स्ट्रक्टरों को एक ही प्रकार का होना चाहिए।

आपने वास्तव में एक कॉपी कन्स्ट्रक्टर नहीं बनाया है। B(const A & x) सिर्फ एक निर्माता है जो संदर्भ के द्वारा const A लेता है।

तो, आपको व्युत्पन्न वर्ग "साथ ही" के लिए एक बनाने की आवश्यकता नहीं है, लेकिन "बिल्कुल"। जैसा कि आपने कहा है, इसका प्रकार B(const B &x) होगा।

1

प्रकार बी के वर्गों के लिए डिफ़ॉल्ट प्रति-सीटी बी (कॉन्स बी &) होगा। चूंकि आपने इसे निर्दिष्ट नहीं किया है, इसलिए संकलक कृपया आपके लिए इसे उत्पन्न करता है।

उपयोगकर्ता परिभाषित विधियों के साथ यह अलग है क्योंकि वे संकलक उत्पन्न नहीं हो सकते हैं।